Last active
June 12, 2020 10:20
-
-
Save MartinMalinda/794072ba1465e84e2508f1ce17d48025 to your computer and use it in GitHub Desktop.
useTaskPrefetch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export function reviveTaskInstance(instance: TaskInstance<any>) { | |
if (instance.isError) { | |
instance._deferredObject.promise = Promise.reject(instance.error); | |
} else { | |
// TODO: fix this | |
instance._deferredObject.promise = Promise.resolve(instance.value) as unknown as Promise<void>; | |
} | |
instance.cancel = () => {}; | |
instance.canceledOn = (signal) => instance; | |
instance._run = () => {}; | |
instance.then = instance._deferredObject.promise.then; | |
instance.catch = instance._deferredObject.promise.catch; | |
instance.finally = instance._deferredObject.promise.finally; | |
} | |
export function useTaskPrefetch<T>(key : string, task: Task<T, any>) : TaskInstance<T> { | |
let taskInstance; | |
const { $ssrContext } = getCurrentInstance() as any; | |
/* Server */ | |
if (process.server) { | |
// perform, add to prefetch, add to ssrContext | |
const taskInstance = task.perform(); | |
onServerPrefetch(async () => { | |
try { | |
await taskInstance; | |
if ($ssrContext?.nuxt) { | |
if (!$ssrContext.nuxt.vueConcurrency) { | |
$ssrContext.nuxt.vueConcurrency = {}; | |
} | |
$ssrContext.nuxt.vueConcurrency[key] = { instances: task._instances }; | |
} | |
} catch (e) { | |
// no need for extra handling | |
} | |
}); | |
return taskInstance; | |
} | |
/* Client */ | |
const nuxtData = (window as any).__NUXT__; | |
if (!nuxtData) { | |
throw Error(`Could not access window.__NUXT__`); | |
} | |
const taskCache = nuxtData.vueConcurrency[key]; | |
if (taskCache) { | |
task._instances = taskCache.instances || []; | |
task._instances.forEach(reviveTaskInstance); | |
delete nuxtData.vueConcurrency[key]; | |
return task.last as TaskInstance<T>; | |
} else { | |
return task.perform(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fetchTask = useTask(function*() { | |
return ajax('/some/api'); | |
}); | |
useTaskPrefetch('data', fetchTask); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment