Skip to content

Instantly share code, notes, and snippets.

@MartinMalinda
Last active June 12, 2020 10:20
Show Gist options
  • Save MartinMalinda/794072ba1465e84e2508f1ce17d48025 to your computer and use it in GitHub Desktop.
Save MartinMalinda/794072ba1465e84e2508f1ce17d48025 to your computer and use it in GitHub Desktop.
useTaskPrefetch
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();
}
}
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