prepareInternalCacheAsync(drawer) {
            let internalCache = this._getInternalCacheRef(drawer);
            if (this._checkInternalCacheUpToDate(internalCache, drawer)) {
                return internalCache.await();
            }

            // Force reset
            if (internalCache && !internalCache.loaded) {
                internalCache.await().then(() => internalCache.destroy());
            }

            $.console.assert(this._tRef, "Data Create called from invalidation routine needs tile reference!");
            const transformedData = drawer.internalCacheCreate(this, this._tRef);
            $.console.assert(transformedData !== undefined, "[DrawerBase.internalCacheCreate] must return a value if usePrivateCache is enabled!");
            const drawerID = drawer.getId();
            internalCache = this[DRAWER_INTERNAL_CACHE][drawerID] = new $.InternalCacheRecord(transformedData,
                drawerID, (data) => drawer.internalCacheFree(data));
            return internalCache.await();
        }
Internal cache is defined by a Drawer. Async preparation happens as the last step in the
invalidation routine.
Must not be called if drawer.options.usePrivateCache == false. Called inside prepareForRenderine
by cache itself if preloadCache == true (supports async behavior).

@private
@param {OpenSeadragon.DrawerBase} drawer
@return {OpenSeadragon.Promise<*>} reference to the data wrapped in a promise,
 or null if not data yet loaded/ready (usually due to error)