Promise.all()
方法的参数必须是一个可迭代对象,通常是一个包含Promise对象的数组,但实际上,只要是符合可迭代协议的对象都可以作为参数,具体如下:
数组
- 示例:这是最常见的使用方式,将多个Promise对象组成一个数组作为
Promise.all()
的参数。
const promise1 = new Promise((resolve) => setTimeout(() => resolve('数据1'), 1000));
const promise2 = new Promise((resolve) => setTimeout(() => resolve('数据2'), 2000));
const promise3 = new Promise((resolve) => setTimeout(() => resolve('数据3'), 1500));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log('所有请求都成功,结果为:', results);
})
.catch((error) => {
console.log('有请求失败,错误为:', error);
});
- 特点:数组中的Promise对象会并行执行,
Promise.all()
会等待所有Promise都变为fulfilled
状态后,将它们的结果按照数组顺序组成一个新的数组作为最终结果。如果其中有一个Promise被rejected
,则Promise.all()
会立即返回一个被rejected
的Promise,并将第一个失败的Promise的错误信息传递给.catch()
方法的回调函数。
类数组对象
- 示例:除了普通数组,类数组对象也可以作为
Promise.all()
的参数。例如,arguments
对象或具有length
属性和索引属性的对象。
function getData() {
const promiseA = new Promise((resolve) => setTimeout(() => resolve('A数据'), 1200));
const promiseB = new Promise((resolve) => setTimeout(() => resolve('B数据'), 1000));
const promiseC = new Promise((resolve) => setTimeout(() => resolve('C数据'), 1500));
return Promise.all(arguments);
}
getData(promiseA, promiseB, promiseC)
.then((results) => {
console.log('所有请求都成功,结果为:', results);
})
.catch((error) => {
console.log('有请求失败,错误为:', error);
});
- 特点:与数组类似,类数组对象中的Promise对象也会并行执行,并且遵循相同的成功和失败处理规则。需要注意的是,类数组对象必须具有可迭代的属性和方法,以便
Promise.all()
能够正确地遍历和处理其中的Promise对象。
可迭代对象
- 示例:ES6中的一些可迭代对象,如
Set
、Map
等,也可以作为Promise.all()
的参数。
const promiseSet = new Set([
new Promise((resolve) => setTimeout(() => resolve('集合数据1'), 1300)),
new Promise((resolve) => setTimeout(() => resolve('集合数据2'), 1100)),
new Promise((resolve) => setTimeout(() => resolve('集合数据3'), 1400))
]);
Promise.all(promiseSet)
.then((results) => {
console.log('所有请求都成功,结果为:', results);
})
.catch((error) => {
console.log('有请求失败,错误为:', error);
});
- 特点:
Promise.all()
会遍历可迭代对象中的每个元素,如果元素是Promise对象,则会等待其状态变化;如果元素不是Promise对象,则会将其视为已经fulfilled
的Promise,并将其本身作为结果。同样,只要其中有一个Promise被rejected
,整个Promise.all()
操作就会失败。
包含Promise和非Promise值的混合对象
- 示例:参数中可以同时包含Promise对象和其他非Promise的值,如字符串、数字等。
const promiseX = new Promise((resolve) => setTimeout(() => resolve('X数据'), 1200));
const valueY = 'Y数据';
const promiseZ = new Promise((resolve) => setTimeout(() => resolve('Z数据'), 1400));
Promise.all([promiseX, valueY, promiseZ])
.then((results) => {
console.log('所有请求都成功,结果为:', results);
})
.catch((error) => {
console.log('有请求失败,错误为:', error);
});
- 特点:在这种情况下,非Promise值会被视为已经
fulfilled
的Promise,其值会直接作为结果数组中的对应元素。Promise.all()
仍然会等待所有的Promise对象都变为fulfilled
状态后才返回最终结果。如果Promise对象中有一个失败,则整个操作失败,并将第一个失败的Promise的错误信息传递给.catch()
方法。
综上所述,Promise.all()
方法的参数类型较为灵活,但无论使用哪种类型的可迭代对象作为参数,其核心的异步操作处理逻辑和成功失败的判断机制都是一致的,都是为了方便地处理多个异步操作的并发执行和结果汇总。