Prmise Static Methods
看到面试题:Promise.all和Promise.any的区别的时候,我都忘了Promise.any是什么,这里记录一下
Promise.any
Promise.any,返回promise数组中,第一个fulfilled的promise的值
- 如果传入空的迭代对象(空数组),就返回一个
rejected的promise的值 - 如果传入不含promise的数组,就会返回
- 其余情况都会返回一个promise,如果数组中其中一个promise变成
fulfilled,那么any返回的promise的值就是第一个变成fulfilled的promise的值 - 如果数组的值都是
rejectd,那么就返回一个rejected的promise
有fulfilled
const pErr = new Promise((resolve, reject) => {
reject("总是失败");
});
const pSlow = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "最终完成");
});
const pFast = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "很快完成");
});
Promise.any([pErr, pSlow, pFast]).then((value) => {
console.log(value);
// pFast fulfils first
})
// 期望输出:"很快完成"Promise.all
手撕
function PromiseAll(arr) {
return new Promise((resolve, reject) => {
const ans = []
const len = arr.length
for(let i in arr) {
Promise.resolve(arr[i]).then(res => {
ans[i] = res
if(ans.length === len) {
resolve(ans)
}
}).catch(err => {
reject(err)
})
}
})
}
const p1 = new Promise((resolve) => {
setTimeout(() => {
resolve('p1')
}, 2000);
})
const p2 = new Promise((resolve) => {
setTimeout(() => {
resolve('p2')
}, 1000);
})
const p3 = new Promise((resolve) => {
setTimeout(() => {
resolve('p3')
}, 3000);
})
const p4 = new Promise((resolve, reject) => {
reject(new Error('p4'))
})
PromiseAll([p1, p2, p3, p4]).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})Updated on 4/26/2023
Table of Contents