promise.all
Promise.prototype.all = function (...iterators) {
let res = [];
let arr = Array.from(iterators); // 可迭代对象转化
return new Promise((resolve, reject) => {
arr.forEach((v, i) => {
if (!v instanceof Promise) v = Promise.resolve(v); //可删除
v.then(res => {
res[i] = res;
if (res.length === arr.length) {
resolve(res); // 使用闭包保存结果与进度
}
}, err => {
reject(err); // 一个reject直接reject
// 但是如果promise本身已经有reject处理时,then处理后是返回一个新的promise的
// 如果reject中的err已经被处理,还是以 res 数组返回
})
})
})
.then(v => { return Promise.resolve(v) })
.catch(e => {
reject(e);
})
}
// 测试
Promise.all(
[1, 2, 3, 4].map((val, idx) => {
if (val == 4) return 4;
return new Promise((resolve, reject) => {
setTimeout(() => {
// if (val == 1) reject('err :v==1'); // 测试reject
// else resolve(-val);
resolve(-val);
}, 5000 - (val * 1000));
}).then(r => {
console.log('success in Promise', idx, val);
}).catch(err => {
console.log('error in Promise', idx, val);
})
}))
.then(res => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
promise.race
Promise.prototype.race = function (...iterators) {
let arr = Array.from(iterators); // 同上转化
return new Promise((resolve, reject) => {
arr.forEach(v => {
if (!v instanceof Promise) v = Promise.resolve(v);
v.then(v => {
resolve(v);
}, err => {
reject(err);
})
})
})
}
// 测试
const p = Promise.race([
new Promise(function (resolve, reject) {
setTimeout(() => {
resolve('success');
}, 4100);
// setTimeout(() => {
// resolve('success');
// }, 5100);
}),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
]);
p
.then(console.log)
.catch(console.error);