Promise之Promise.all ()
描述
参考MDN
developer.mozilla.org/zh-CN/docs/…
Promise.all(iterable);
Copy to Clipboard
参数
返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的
Promise。 - 如果传入的参数不包含任何
promise,则返回一个异步完成(asynchronously resolved)Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的Promise。 - 其它情况下返回一个处理中(pending)的
Promise。这个返回的promise之后会在所有的promise都完成或有一个promise失败时异步地变为完成或失败。见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的promise顺序排列,而不是由调用promise的完成顺序决定。
说明
此方法在集合多个 promise 的返回结果时很有用。
完成(Fulfillment): 如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。 如果所有传入的 promise 都变为完成状态,或者传入的可迭代对象内没有 promise,Promise.all 返回的 promise 异步地变为完成。 在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。
失败/拒绝(Rejection): 如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。
简要的概述一下: 1. 返回一个可迭代的对象, 所有的promise都执行成功, 则返回执行成功的resolved状态的数组,且结果有序, 其中有一个失败rejected ,则全部失败
-
因为方法前有一个类名,所以它是一个静态方法在Promise内部 static all()
-
返回一个Promise实例
-
接收一个可遍历的对象
-
任何一个Promise 回调函数不合法就立即抛出错误
function PromiseAll(array) {
//结果数组
let result = [];
//添加标识 看Array里面的值是否都执行完了
let index = 0
//返回一个Promise实例
return new Promise((resolve, reject) => {
//将返回值添加到数组当中
function addData(key, value) {
result[key] = value;
index++;
//保证数组中的值都执行完毕了,在把值给resolve出去
if (index === array.length) {
resolve(result)
}
}
for (let i = 0; i < array.length; i++) {
let current = array[i];
if (current instanceof Promise) {
//Promise对象
current.then(value => {
addData(i, value)
}, reason => reject(reason))
} else {
//普通值
addData(i, current)
}
}
})
}
/************** test *****************/
let p1 = new Promise((resolve, reject) =>{
resolve( 1)
})
let p2 = new Promise((resolve, reject) =>{
resolve( '测试数据')
})
PromiseAll([1,2,3,4,'44334',p1,p2]).then(res=>{
console.log(res)
})
//[ 1, 2, 3, 4, '44334', 1, '测试数据' ]