前言
什么Promise.all(), Promise.any(), Promise.race(), Promise.allSettled()
都是并行执行,并按照一定规则来决定Promise的状态
。
可当Promise
之间有严格的执行顺序时,就需要手动将Promise
串起来
场景
1. 顺序执行: 后一个P
只要求前一个P
执行完即可
;(async () => {
for (let i = 0; i < 4; i++) {
try {
const res = await foo(i)
console.log(res)
} catch (e) {
console.log(e)
}
}
})()
或者
let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
// 珠子串起来
pedding = pedding.then(() => {
// 每个珠子都完整的处理
return foo(i).then(res => {
console.log(res);
}).catch(e => {
console.log(e);
})
})
}
2. 顺序执行: 全部P
成功或失败P
中断
let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
// 珠子串起来
pedding = pedding.then(res => {
// 每个珠子只处理resolve, reject自动透传
console.log(res)
return foo(i)
})
}
// 兜底reject
pedding.catch(e => {
console.log(e)
})
3. 在2的基础上返回最后一个成功的信息
let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
// 珠子串起来
pedding = pedding.then(async prev => {
// 每个珠子返回一个P, 成功时resolve(value), 失败时reject(prev)
try {
const res = await foo(i)
console.log(res)
return res
} catch (e) {
throw prev
}
})
}
pedding.then(info => {
console.log('全部成功', info)
}).catch(info => {
console.log('最后一个成功', info)
})
总而言之
原则就是将P
串成.then().then()....then()
链的形式,注意一定要写成pedding = pedding.then()
的形式,如果写成pedding.then()
就成下图了