手写Promise.all完整实现
请手写实现Promise.all方法,需满足:1)所有resolve才resolve 2)任一reject就reject 3)保持结果顺序。
回答
苦行僧
Promise.myAll = function(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('promises must be an array'));
}
if (promises.length === 0) return resolve([]);
const results = [];
let completed = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise).then(
value => {
results[index] = value;
completed++;
if (completed === promises.length) resolve(results);
},
reason => reject(reason)
);
});
});
};
const p1 = Promise.resolve(1);
const p2 = new Promise(r => setTimeout(() => r(2), 100));
const p3 = 3;
Promise.myAll([p1, p2, p3]).then(console.log);
注意:1)使用Promise.resolve包装非Promise值;2)results保持输入顺序(用index赋值);3)空数组立即resolve([])。