语法
Promise.all(iterable);
参数
iterable
返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。
- 如果传入的参数不包含任何
promise
,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。 - 其它情况下返回一个处理中(pending)的Promise。这个返回的
promise
之后会在所有的promise
都完成或有一个promise
失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的promise
顺序排列,而不是由调用promise
的完成顺序决定。
1) 核心思路
- 接收一个 Promise 实例的数组或具有 Iterator 接口的对象作为参数
- 这个方法返回一个新的 promise 对象,
- 遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象
- 参数所有回调成功才是成功,返回值数组与参数顺序一致
let all1=function(arr){ let index=0,result=[] return new Promise((resolve,reject)=>{ arr.forEach((p,i)=>{ //普通值返回成功状态,promise直接返回(不改变成功或者失败状态) Promise.resolve(p).then( //成功 val=>{ index++ result[i]=val if(index===arr.length){ //返回全部成功的数组 resolve(result) } },err=>{ //失败 reject(err) }) }) }) } let p1 = new Promise(function (resolve, reject) { setTimeout(function () { resolve(1) }, 1000) }) let p2 = new Promise(function (resolve, reject) { setTimeout(function () { resolve(2) }, 2000) }) let p3 = new Promise(function (resolve, reject) { setTimeout(function () { resolve(3) }, 3000) }) all1([p3, p1, p2]).then(res => { console.log(res) // [3, 1, 2] })