promise-ax
Version:
Promise Ax (Promesa) es usado para computaciones asíncronas. Una promesa representa un valor que puede estar disponible ahora, en el futuro, o nunca.
113 lines (112 loc) • 4.02 kB
JavaScript
;
const { Utils } = require("./utils/general.utils.js");
class PromiseAx {
/**
* Lo que primero se cumpla, es lo que se devuelve.
*/
promiseWithTimeOut(promise, time, messageTimeOut) {
let timer;
let error = messageTimeOut ? new Error(messageTimeOut) : new Error("Request timed out");
return Promise.race([
promise,
new Promise((_, rej) => timer = setTimeout(rej(error), time))
]).finally(() => clearTimeout(timer));
}
all(iterable) {
if (Utils.isEmpty(iterable) === true) {
return this.resolve([]);
}
return Promise.all(iterable);
}
allSettledWithTimeOut(iterable, timeout, messageTimeOut = "") {
if (Utils.isEmpty(iterable) === true) {
return this.resolve([]);
}
if (Utils.isEmpty(timeout) || isNaN(Number(timeout)) === true || timeout < 0) {
return this.reject(new Error("Timeout is not defined"));
}
return new Promise((resolve, _reject) => {
const results = [];
var index = 0;
var completed = 0;
const length = iterable.length;
while (index < length) {
const indexCurrent = index;
try {
let value = iterable[index];
this.promiseWithTimeOut(value, timeout, messageTimeOut).then((result) => {
completed++;
results[indexCurrent] = result;
if (completed == iterable.length) {
resolve(results);
}
}).catch((error) => {
completed++;
results[indexCurrent] = error;
if (completed == iterable.length) {
resolve(results);
}
});
} catch (error) {
completed++;
results[indexCurrent] = error;
if (completed == iterable.length) {
resolve(results);
}
} finally {
++index;
}
}
});
}
allSettled(iterable) {
if (Utils.isEmpty(iterable) === true) {
return this.resolve([]);
}
return new Promise((resolve, _reject) => {
const results = [];
var index = 0;
var completed = 0;
const length = iterable.length;
while (index < length) {
const indexCurrent = index;
try {
let value = iterable[index];
this.resolve(value).then((result) => {
completed++;
results[indexCurrent] = result;
if (completed == iterable.length) {
resolve(results);
}
}).catch((error) => {
completed++;
results[indexCurrent] = error;
if (completed == iterable.length) {
resolve(results);
}
});
} catch (error) {
completed++;
results[indexCurrent] = error;
if (completed == iterable.length) {
resolve(results);
}
} finally {
++index;
}
}
});
}
race(iterable) {
return Promise.race(iterable);
}
reject(reason) {
return Promise.reject(reason);
}
resolve(value) {
return Promise.resolve(value);
}
}
module.exports = {
PromiseAx
};