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.race
const 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.all
const 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.allSettled
const 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.all
Promise.any() :任意一个 promise 被 resolve ,就会立即被 resolve ,并且 resolve 的是第一个正确结果;只有所有的 promise 都 reject 时整体才会 reject。
Promise.any():不会因为某个 Promise 变成 rejected 而结束,哪怕首个 promise 是 rejected,可能还会有另一个 promise 成功。