实现promise的all与race

Promise.all(iterable)

总结:
Promise承受一个iterable类型的输出(如Array、Set、Map)等,
当iterable参数所有的Promise对象都resolve时,该办法会返回一个蕴含所有resolve传递的值的Promise实例。

办法实例

const promise1 = Promise.resolve(3);const promise2 = 42;const promise3 = new Promise((resolve, reject) => {  setTimeout(resolve, 100, 'foo');});Promise.all([promise1, promise2, promise3]).then((values) => {  console.log(values);});// expected output: Array [3, 42, "foo"]

手写实现

function promiseAll(arrays){    if(!Array.isArray(arrays))    return 'not Array'    var promiseValues = []    var promiseCount = 0    return new Promise((resolve,reject)=>{    for(var i = 0; i < arrays.length; i++){       Promise.resolve(arrays[i]).then((value)=>{             promiseValues.push(value)             promiseCount++             if(promiseCount == arrays.length)                resolve(promiseValues)        }, (err)=>{reject(err)})    }  })}

测试用例

promiseAll([promise1,promise2,promise3]).then((values)=>{console.log(values)})//[3, 42, "foo"]

Promise.race(iterable)

总结:当iterable参数中任意一个promise胜利或失败,则返回蕴含该值的promise实例。

办法实例

const promise1 = new Promise((resolve, reject) => {  setTimeout(resolve, 500, 'one');});const promise2 = new Promise((resolve, reject) => {  setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then((value) => {  console.log(value);  // Both resolve, but promise2 is faster});// expected output: "two"

手写实现

function promiseRace(arrays){    if(!Array.isArray(arrays))    return 'not Array'    return new Promise((resolve,reject)=>{    for(var i = 0; i < arrays.length; i++){       Promise.resolve(arrays[i]).then((value)=>{                resolve(value)        }, (err)=>{reject(err)})    }  })}

测试用例

promiseRace([promise1,promise2]).then(function(value){console.log(value)})  // one