her-promise
Version:
This is a polyfill of the ES6/ES9/ES11/ES12 Promise.
51 lines (44 loc) • 1.1 kB
text/typescript
import { defineProp, isArr } from './utils';
export let $AggregateError: AggregateErrorConstructor;
if (typeof AggregateError === 'function') {
$AggregateError = AggregateError;
} else {
$AggregateError = class extends Error {
constructor(public errors: any[], message = 'All promises were rejected.') {
super(message);
}
};
}
defineProp(
Promise,
'any',
<T>(values: Iterable<T | PromiseLike<T>>): Promise<T> =>
new Promise((resolve, reject) => {
if (!isArr(values)) {
reject(new TypeError('The arguments must be Array.'));
return;
}
const { length } = values;
const reasons = new Array(0);
if (length === 0) {
reject(new $AggregateError(reasons));
return;
}
let count = 0;
function onReject(reason: any): void {
reasons.push(reason);
if (++count === length) {
reject(new $AggregateError(reasons));
}
}
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(resolve, onReject);
}
})
);