UNPKG

recoil-toolkit

Version:
51 lines 2.36 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { uniqueId } from '../_core'; import { tasks, taskById } from '../atoms'; import { pushTask, updateTaskDone, updateTaskError } from '../updaters'; import { cancelTask, createCancelled, createWaitFor } from './waitFor'; export const createFork = (parentId, recoil) => (taskCreator, args, debugKey) => { /* child task id */ const id = uniqueId(); const cancelledChild = createCancelled(id); const cancelled = () => recoil.cancelled() || cancelledChild(); const cancel = () => cancelTask(id); const waitFor = createWaitFor(cancelled); /* injected current snapshot */ const snapshot = recoil.getSnapshot(); const childRecoil = Object.assign(Object.assign({}, recoil), { snapshot, waitFor, cancelled }); /* injected fork recursively */ const fork = createFork(id, childRecoil); const execute = taskCreator(Object.assign(Object.assign({}, childRecoil), { fork })); const childTaskObj = { parentId, id, args, options: debugKey ? { key: debugKey } : undefined, }; const taskRunner = () => __awaiter(void 0, void 0, void 0, function* () { try { recoil.set(tasks, pushTask(childTaskObj)); const data = yield execute(...args); recoil.set(tasks, updateTaskDone({ data, id })); return data; } catch (error) { recoil.set(tasks, updateTaskError({ error, id })); } }); /* run child task */ const task = taskRunner(); const getTaskState = () => recoil.getLoadable(taskById(id)).getValue(); return { id, cancel, task, getTaskState }; }; //# sourceMappingURL=fork.js.map