her-promise
Version:
This is a polyfill of the ES6/ES9/ES11/ES12 Promise.
55 lines (48 loc) • 1.02 kB
text/typescript
import { defineProp, isArr } from './utils';
defineProp(
Promise,
'allSettled',
<T>(values: Iterable<T | PromiseLike<T>>): Promise<Array<PromiseSettledResult<T>>> =>
new Promise((resolve, reject) => {
if (!isArr(values)) {
reject(new TypeError('The arguments must be Array.'));
return;
}
const { length } = values;
const results: Array<PromiseSettledResult<T>> = new Array(length);
if (length === 0) {
resolve(results);
return;
}
let count = 0;
function allDone(): void {
if (++count === length) {
resolve(results);
}
}
for (let i = 0; i < length; ++i) {
let p: Promise<T>;
if (values[i] instanceof Promise) {
p = values[i];
} else {
p = Promise.resolve(values[i]);
}
p.then(
value => {
results[i] = {
status: 'fulfilled',
value
};
allDone();
},
reason => {
results[i] = {
status: 'rejected',
reason
};
allDone();
}
);
}
})
);