Promise.all
是 JavaScript 中 Promise API 的一个方法,它用于同时处理多个 Promise 对象。Promise.all
接受一个 iterable(如数组)作为输入,其中每个成员都是一个 Promise。其基本原理是:
-
并发执行:
Promise.all
会并发地执行所有的 Promise,即不是按顺序一个接一个执行,而是同时开始执行。 -
状态汇集:
Promise.all
会创建一个新的 Promise,这个新的 Promise 的状态取决于传入的所有 Promise。- 如果所有输入的 Promise 都成功解决(resolve),
Promise.all
返回的 Promise 也会解决,并且其解决值是一个数组,包含所有输入 Promise 的解决值,按照输入数组的顺序排列。 - 如果有任何输入的 Promise 被拒绝(reject),
Promise.all
直接返回一个被拒绝的 Promise,并且其拒绝原因通常是第一个被拒绝的 Promise 的拒绝原因。这意味着,一旦有任何 Promise 被拒绝,Promise.all
就不会等待其他 Promise 完成它们的操作。
- 如果所有输入的 Promise 都成功解决(resolve),
-
错误处理:由于
Promise.all
一旦遇到拒绝就会立即拒绝,所以它通常需要配合.catch
方法来处理错误,或者可以在每个 Promise 中分别处理错误。
手写一个Promise.all的实现:
Promise.all = function(promiseArr) {
let index = 0,result = [];
return new Promise((resolve,reject) => {
promiseArr.forEach((p,i) => {
Promise.resolve(p).then(val => {
index++;
result[i] = val;
if (index === promiseArr.length) {
resolve(result) }
},
err => {
reject(err)}
})
})
})
}