Promise.allSettled(iterable)
参数:iterable(一个可迭代的对象,例如Array,其中每个成员都是Promise)
返回值: 输入[promise1,promise2]
, 无论成功或失败,都会按顺序异步返回结果。
{
status: 'fulfilled',
value: result//返回promise的值
}
{
status: 'rejected',
reason: error//返回promise拒绝的值
}
此方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。
使用场景: 当有多个彼此不依赖的异步任务成功完成时,或者你总是想知道每个promise的结果时,通常使用它。 Promise.all 更适合彼此相互依赖或者在其中任何一个reject时立即结束。
实现Promise.allSettled
function allSettled(promises) {
if(promises.length === 0){
return Promise.resolve([])
}
return new Promise((resolve, reject) => {
let result = [];//收集数组
let num = 0; // 表示符合条件的promise状态个数变量
const check = () =>{
if(num === promises.length){
resolve(result);
}
}
promises.forEach((item, index)=>{
//传入的promises不一定都是promise对象,需要借助Promise.resolve将其包装成promise
Promise.resolve(item).then(
res => {
result[index] = {
status: 'fulfilled',
value: res
}
num++
check()
},
err => {
result[index] = {
status: 'rejected',
reason: err
}
num++
check()
}
)
})
})
}
Promise.resolve(value)方法
- value传入promise,返回这个promise
- value 是thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象
- value是值,返回值
手写Promise.all
function all(promises){
if(promises.length === 0){
Promise.resolve([])
}
return new Promise((resolve, reject) => {
let result = []
let num = 0
const check = () => {
if (num === promises.length) {
resolve(result)
}
}
promises.forEach((item, index) => {
Promise.resolve(item).then(
res => {
result[index] = res
num++
check()
},
err => {
reject(err)
}
)
})
})
}