UNPKG

@comyata/run

Version:

Simplify data workflows and management with data templates, for browser and server.

63 lines 1.92 kB
/** * @internal */ export class ValueSubscriberPromise extends Promise { #dependents = new Set(); #subscribers; #result = undefined; constructor(subscribers, dataNode) { super(resolve => { // throwing here may lead to uncaught errors in react but not nodejs somehow, // in react it is only used to know when to show progress loaders in e.g. JSONView, but not awaited // as anything which tries to listen, will receive rejects below and the actual exception is handled at another position, // it should be best and safe to just set to undefined on errors subscribers.push((nodeResult, err) => { this.#result = err ? { error: err } : { value: nodeResult }; resolve(err ? undefined : nodeResult); }); }); this.#subscribers = subscribers; this.dataNode = () => dataNode; } addDependent(n) { this.#dependents.add(n); } hasDependent(n) { return this.#dependents.has(n); } getDependents() { return Array.from(this.#dependents); } then(onfulfilled, onrejected) { if (this.#result) { return (this.#result.error ? Promise.reject(this.#result.error) : Promise.resolve(this.#result.value)).then(onfulfilled, onrejected); } return new Promise((resolve, reject) => { this.#subscribers.push((result, err) => { if (err) { reject(err); return; } resolve(result); }); }).then(onfulfilled, onrejected); } catch(onrejected) { if (this.#result) { return (this.#result.error ? Promise.reject(this.#result.error) : Promise.resolve(this.#result.value)).catch(onrejected); } return new Promise((resolve, reject) => { this.#subscribers.push((result, err) => { if (err) { reject(err); return; } resolve(result); }); }).catch(onrejected); } }