异步循环函数,搞一点工作里面可以用到的

316 阅读1分钟

出题

  • 循环 items 调用 asyncUppercase,看看你们可以想出多少种 循环的方式,并行 和 串行 都实现一下,这个应用里面应该挺常见的,比如拿到了 3 个用户id ,然后发起请求 和后端要数据,这个就是异步循环

  • 串行

    const asyncUppercase = (item) =>
      new Promise((resolve) =>
        setTimeout(
          () => resolve(item.toUpperCase()),
          Math.floor(Math.random() * 1000)
        )
      )
    const uppercaseItems = async () => {
      // 串行
      const items = ['a', 'b', 'c']
      for (item of items) {
        const uppercaseItem = await asyncUppercase(item)
        console.log(uppercaseItem)
      }

      console.log('Items processed')
    }
    uppercaseItems()
大家还有其它串行的方法吗?
  • 并行1-Promise.all
    const asyncUppercase = (item) =>
      new Promise((resolve) =>
        setTimeout(() => {
          let upper = item.toUpperCase();
          resolve(upper);
          console.log(upper);
        }, Math.floor(Math.random() * 1000))
      );
    const items = ["a", "b", "c"];
    Promise.all(
      items.map((item) => {
        return asyncUppercase(item);
      })
    ).then((res) => {
      console.log(res);
    });
  • 并行2 实现按照实际执行的顺序输出结果
const asyncUppercase = (item) =>
  new Promise((resolve) =>
    setTimeout(
      () => resolve(item.toUpperCase()),
      Math.floor(Math.random() * 1000)
    )
  );
const items = ["a", "b", "c"];
let pendingP = items.map(asyncUppercase);
// console.log(res);

new Promise((resolve, reject) => {
  let index = 0;
  let arr = [];
  pendingP.forEach((item) => {
    item.then((_res) => {
      console.log(_res);
      arr[index] = _res;
      index++;
      if (index == pendingP.length) {
        resolve(arr);
      }
    });
  });
}).then((res) => {
  console.log(res);
});
  • 并行3 与Promise.all效果一样
const items = ["a", "b", "c"];
let res = items.map(asyncUppercase);
console.log(res);

new Promise((resolve, reject) => {
  let index = 0;
  let arr = [];
  res.forEach((item, i) => {
    item.then((_res) => {
      console.log(_res);
      arr[i] = _res;
      index++;
      if (index == res.length) {
        resolve(arr);
      }
    });
  });
}).then((res) => {
  console.log(res);
});