闽公网安备 35020302035485号
const promises = [
Promise.reject('ERROR A'),
Promise.reject('ERROR B'),
Promise.resolve('result'),
]
Promise.any(promises).then((value) => {
console.log('value: ', value) // value: result
}).catch((err) => {
console.log('err: ', err)
})
如果所有传入的 promises 都失败: const promises2 = [
Promise.reject('ERROR A'),
Promise.reject('ERROR B'),
Promise.reject('ERROR C'),
]
Promise.any(promises2).then((value) => {
console.log('value:', value)
}).catch((err) => {
console.log('err:', err)
console.log(err.errors)
})
三、Promise.raceconst promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two')
})
Promise.race([promise1, promise2]).then((value) => {
console.log(value) // 'two'
})
四、Promise.allconst promise1 = Promise.resolve(3)
const promise2 = 42
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo')
})
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values) // [3, 42, "foo"]
})
当三个 promise 都完成时,Promise.all 就完成了,并且输出被打印了。如果其中一个 promise 失败了,则 Promise.all 整体将会失败。const promise1 = Promise.resolve(3)
const promise2 = Promise.reject('error')
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo')
})
Promise.all([promise1, promise2, promise3])
.then(values => ...)
.catch(err => console.log(err)) // 'error'
当需要处理多个 Promise 并行时,大多数情况下 Promise.all 用起来是非常顺手的,但是一旦有一个promise 出现了异常(reject),情况就会变的麻烦。尽管能用 catch 捕获其中的异常,但你会发现其他执行成功的 Promise 的消息都丢失了,仿佛石沉大海一般。let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "3")
});
let p4 = Promise.reject(4)
let p5 = Promise.reject(5).catch((e) => e)
// 情况1:promise全部resolve
Promise.all([p1, p2, p3]).then(values => {
console.log(values) // 其中p1、p2、p3都成功,所以进入then()
}).catch(function(err) {
console.log(err) // 永远走不到这里
});
// 情况2:promise有一个reject,且reject没有主动捕获异常
Promise.all([p1, p2, p4]).then(values => {
console.log(values) // 其中p4失败,且没有主动捕获异常,永远走不到这里
}).catch(function(err) {
console.log(err) // 此时走到catch 4
});
// 情况3:promise有一个reject,且reject主动捕获异常
Promise.all([p1, p2, p5]).then(values => {
console.log(values) // 其中p5失败,但是主动捕获了p5的异常,所以进入then()
}).catch(function(err) {
console.log(err) // 永远走不到这里
});
// 情况4:使用Promise.allSettled
Promise.allSettled([p1, p2, p4]).then(values => {
console.log(values) // 其中p4失败,但是使用Promise.allSettled,所以进入then()
}).catch(function(err) {
console.log(err)
})
五、Promise.allSettledconst promise1 = Promise.resolve(3)
const promise2 = Promise.reject(new Error('An error'))
const promise3 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'))
const promises = [promise1, promise2, promise3]
// 堆代码 duidaima.com
Promise.allSettled(promises).then((res) => console.log(res))
六、Promise.any vs Promise.allPromise.any() :任意一个 promise 被 resolve ,就会立即被 resolve ,并且 resolve 的是第一个正确结果;只有所有的 promise 都 reject 时整体才会 reject。
Promise.any():不会因为某个 Promise 变成 rejected 而结束,哪怕首个 promise 是 rejected,可能还会有另一个 promise 成功。