手写Promise.race/Promise.any/Promise.allSettled
请手写实现Promise.race、Promise.any和Promise.allSettled三个静态方法。
回答
苦行僧
Promise.myRace = function(promises) {
return new Promise((resolve, reject) => {
for (const promise of promises) {
Promise.resolve(promise).then(resolve, reject);
}
});
};
Promise.myAny = function(promises) {
return new Promise((resolve, reject) => {
let count = 0;
const errors = [];
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then(resolve, err => {
errors[i] = err;
count++;
if (count === promises.length) reject(new AggregateError(errors, 'All rejected'));
});
}
});
};
Promise.myAllSettled = function(promises) {
return Promise.all(promises.map(p =>
Promise.resolve(p).then(
value => ({ status: 'fulfilled', value }),
reason => ({ status: 'rejected', reason })
)
));
};
区别:race返回第一个settled的;any返回第一个fulfilled的;allSettled等待全部完成不短路。