Promise.all 和 Promise.race的简单实现
简介
-
Promise.all()
- 参数
是一个可迭代对象,数组或字符串。 - 返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个已完成状态的 Promise。
- 如果传入的参数不包含任何 promise,则返回一个异步完成 Promise。注意:Google Chrome 58 在这种情况下返回一个已完成状态的 Promise。
- 其它情况下返回一个处理中的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。
- 简单实现
function myAll(promiseArr){ let result = []; // 保存每个Promise的结果 let count = 0; // 计数,用来判断是否都执行完了 return new Promise((resolve, reject) => { for(let i = 0; i < promiseArr.length; i++){ let item = promiseArr[i]; if(isPromise(item)){ item.then(res => { result[i] = res; count++; if(count === promiseArr.length){ resolve(result); } },err => { reject(err); }) }else{ result[i] = item; count++; if(count === promiseArr.length){ resolve(result); } } } }) } // 判断是否是 Promise function isPromise(x){ return (x instanceof Promise); } let p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(1) },2000) }) let p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve(2) },1000) }) // 调用 myAll([p1,p2]).then(res => { console.log(res); })
- 参数
-
Promise.race()
- 参数
是一个可迭代对象,数组或字符串。 - 返回值
一个待定的 Promise 只要给定的迭代中的一个promise解决或拒绝,就采用第一个promise的值作为它的值,从而异步地解析或拒绝(一旦堆栈为空)。 - 简单实现
// 我的 Promise.race() function myRace(promiseArr){ return new Promise((resolve, reject) => { for(item of promiseArr){ if(isPromise(item)){ item.then(res => { resolve(res); }).catch(res => { reject(res); }) }else{ resolve(item); } } }) } // 判断传入的参数是不是Promise function isPromise(x){ return (x instanceof Promise); } let p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(1) },2000) }) let p2 = new Promise((resolve, reject) => { setTimeout(() => { reject(2) },3000) }) // 调用 myRace myRace([p1,p2]).then(res => { console.log(res) })
- 参数