export const promisify = (fn) => {
return (...args) => {
return new Promise((resolve, reject) => {
fn(...args, (err, data) => {
if (err) reject(err);
else resolve(data);
});
});
};
};
export const all = (promises) => {
return new Promise((resolve, reject) => {
if (promises.length === 0) resolve([]);
const results = [];
let completed = 0;
promises.forEach((p, i) => {
Promise.resolve(p).then(val => {
results[i] = val;
completed++;
if (completed === promises.length) resolve(results);
}).catch(reject);
});
});
};
export const allSettled = (promises) => {
return new Promise((resolve) => {
if (promises.length === 0) resolve([]);
const results = [];
let completed = 0;
promises.forEach((p, i) => {
Promise.resolve(p).then(val => {
results[i] = { status: 'fulfilled', value: val };
}).catch(err => {
results[i] = { status: 'rejected', reason: err };
}).finally(() => {
completed++;
if (completed === promises.length) resolve(results);
});
});
});
};
export const race = (promises) => {
return new Promise((resolve, reject) => {
promises.forEach(p => Promise.resolve(p).then(resolve).catch(reject));
});
};
export const any = (promises) => {
return new Promise((resolve, reject) => {
if (promises.length === 0) resolve();
const errors = [];
let rejectedCount = 0;
promises.forEach((p, i) => {
Promise.resolve(p).then(resolve).catch(err => {
errors[i] = err;
rejectedCount++;
if (rejectedCount === promises.length) {
reject(new AggregateError(errors, 'All promises were rejected'));
}
});
});
});
};