类 promise all 效果 顺序执行函数

122 阅读1分钟

/**

  • @ 实现类似 promise all 顺序执行
  • async await 化异步为同步编程
  • getResult 函数返回 new Promise */

基本实现

const getResult = (arr) => {
  let res = []
  return new Promise(async (resolve, reject) => {
    for (let fn of arr) {
      res.push(await fn());
      res.length == arr.length ? resolve(res) : ''; 
    }
  })
}

示例代码

const fun1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1)
    }, 1000);
  })
}

const fun2 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(2)
    }, 3000);
  })
}

const fun3 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(3)
    }, 500)
  })
}

const fun4 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(4)
    }, 2000)
  })
}

let data = getResult([fun1, fun2, fun3, fun4]).then(data => {
  console.log(data);
})

由于处理函数直接push 操作结果没有进行异常处理;所以进行reject 返回会报异常错误;此时处理一下

const getResult = (arr) => {
  let result = []
  return new Promise(async (resolve, reject) => {
    for (let fn of arr) {
      await fn().then(res => {
        result.push(res);
      }).catch(err => {
        result.push({fn,msg:err});
      })
      result.length == arr.length ? resolve(result) : '';
    }
  });
}

由于返回的是promise对象,所以需要对其进行 catch 异常处理