# 语法
Promise.all(iterable);
1
# 参数
iterable
一个可迭代对象,
Array
,Map
,Set
都属于ES6
的iterable
类型
# 返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个**已完成(already resolved)**状态的
Promise
。 - 如果传入的参数不包含任何
promise
,则返回一个异步完成(asynchronously resolved)Promise
。 - 其它情况下返回一个处理中(pending)的
Promise
。这个返回的promise
之后会在所有的promise
都完成或有一个promise
失败时异步地变为完成或失败。 - 返回值将会按照参数内的
promise
顺序排列,而不是由调用promise
的完成顺序决定。
# 类型签名
Promise.all<T>(promises: Iterable<Promise<T>>): Promise<Array<T>>
1
# 说明
此方法在集合多个 promise
的返回结果时很有用。
完成(Fulfillment):
如果传入的可迭代对象为空, Promise.all
会同步地返回一个已完成( resolved
)状态的 promise
。
如果所有传入的 promise
都变为完成状态,或者传入的可迭代对象内没有 promise
, Promise.all
返回的 promise
异步地变为完成。
在任何情况下, Promise.all
返回的 promise
的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。
失败/拒绝(Rejection):
如果传入的 promise
中有一个失败( rejected
), Promise.all
异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise
是否完成。
# 简单实现
function all(promises) {
return new Promise((reslove, reject) => {
let index = 0
for (const promise of promises) {
const currentIndex = index
promise.then((value) => {
if (errorFlag) {
return
}
result[currentIndex] = value
elementCount++
if (elementCount === result.length) {
reslove(result)
}
}, (error) => {
if (errorFlag) {
return
}
errorFlag = true
reject(error)
})
index++
}
if (index === 0) {
reslove([])
return
}
const result = new Array(index)
let errorFlag = false
let elementCount = 0
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33