4

实现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

文刀明
36 声望0 粉丝