@comyata/run
Version:
Simplify data workflows and management with data templates, for browser and server.
63 lines • 1.92 kB
JavaScript
/**
* @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);
}
}