simple-pure-utils
Version:
Funciones puras para manipulación de objetos, arreglos, promesas y observables
106 lines • 7.71 kB
JavaScript
import { isPromiseLike } from "./is";
/**Muy similar al @see Promise pero si el resolve se ejecuta inmediatamente la promesa se resuelve síncronamente
* Esto permite obtener el valor de una promesa resuelta sincronamente con el @see syncPromiseValue
* Puede convertir una promesa de javascript a un SyncPromise con el @see toSyncPromise, aunque no tendrá el comportamiento síncrono
*
* Para que una promesa sea sincrona desde su origen debe de ser creada de forma síncrona, ya sea construyendo esta clase o con los metodos para crear promesas como
* @see synResolve @see syncFail @see splitPromise
*
* Note que @see delay(0) no devuelve una promesa síncrona
*/
export class SyncPromise {
constructor(executor) {
this.resolve = value => {
if (isPromiseLike(value)) {
value.then(this.resolve, this.reject);
return;
}
this.syncResolve(value);
};
this.syncResolve = (value) => {
this.value = value;
this.status = "resolved";
this.callListeners();
};
this.reject = reason => {
this.error = reason;
this.status = "error";
this.callListeners();
};
this.listeners = [];
this.callListeners = () => {
for (const l of this.listeners)
l();
};
this.status = "pending";
this.callThenArg = (arg) => {
if (this.status == "pending")
throw new Error("Aun no se puede llamar a los thenArgs");
switch (this.status) {
case "resolved":
if (arg.onfulfilled) {
return arg.onfulfilled(this.value);
}
return this.value;
case "error":
if (arg.onrejected) {
return arg.onrejected(this.error);
}
return this.error;
}
};
executor(this.resolve, this.reject);
}
then(onfulfilled, onrejected) {
switch (this.status) {
case "pending":
{
const onF = onfulfilled;
return new SyncPromise((resolve, reject) => {
return this.listeners.push(() => {
const value = this.callThenArg({ onfulfilled, onrejected });
if (this.status == "resolved" || onrejected)
resolve(value);
else {
reject(value);
}
});
});
}
case "resolved":
{
if (onfulfilled) {
const ret = onfulfilled(this.value);
if (isPromiseLike(ret)) {
return ret;
}
else {
return syncResolve(ret);
}
}
return syncResolve(this.value);
}
case "error":
{
if (onrejected) {
const ret = onrejected(this.error);
if (isPromiseLike(ret))
return ret;
else
return syncResolve(ret);
}
debugger;
return syncFail(this.error);
}
}
}
}
export function syncResolve(x) {
return new SyncPromise((resolve) => resolve(x));
}
export function syncFail(reason) {
return new SyncPromise((resolve, reject) => reject(reason));
}
/**Una promesa que nunca se resuleve */
export const never = new Promise(() => { });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvbWlzZS9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3JDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBWSxRQUdIO1FBSVQsWUFBTyxHQUF5QyxLQUFLLENBQUMsRUFBRTtZQUNwRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFTSxnQkFBVyxHQUF3QixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUE7UUFFRCxXQUFNLEdBQTJCLE1BQU0sQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUE7UUFFRCxjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUMvQixrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUNqQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUMxQixDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQTtRQUlELFdBQU0sR0FBcUMsU0FBUyxDQUFDO1FBRXJELGdCQUFXLEdBQUcs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