【备忘】JavaScript 队列执行异步任务

吐槽/反馈/建议:我的咸鱼心  爱发电-@wdssmq

需求概述

遍历给定数据(此处为数组),依次执行针对数据项的异步任务。

【【所以机翻的文件名真的有意义么「- -」】】

代码

(() => {
  const items = [
    {
      "code": 1,
      "name": "A",
      "children": [
        {
          "code": 101,
          "name": "A-a"
        },
        {
          "code": 102,
          "name": "A-b"
        }
      ]
    },
    {
      "code": 2,
      "name": "B",
      "children": [
        {
          "code": 201,
          "name": "B-a"
        },
        {
          "code": 102,
          "name": "B-b"
        }
      ]
    }
  ];

  // 执行队列,第二个参数控制是否循环执行
  async function runPromiseByQueue(listPromises, loop = 0) {
    // console.log(listPromises);
    for (let itemPromise of listPromises) {
      await itemPromise();
    }
    if (loop) {
      await runPromiseByQueue(listPromises, loop);
    }
  }

  // 返回项为一个函数,该函数调用时会建立一个 Promise 对象并立即执行
  // 当内部调用 solve() 时表示该异步项执行结束
  const createPromise = (item, level = 0) => () =>
    new Promise((solve) => {
      setTimeout(async () => {
        console.log(level, item.name);
        if (item.hasOwnProperty("children")) {
          level++;
          const curQueue = createQueue(item.children, level);
          await runPromiseByQueue(curQueue);
        }
        solve();
      }, 1370);
    });

  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

  // // 理论上也可以像下边这样延迟
  // const createPromise = (item, level = 0) => () =>
  //   new Promise((solve) => {
  //     (async () => {
  //       await sleep(1370);
  //       console.log(level, item.name);
  //       if (item.hasOwnProperty("children")) {
  //         level++;
  //         const curQueue = createQueue(item.children, level);
  //         await runPromiseByQueue(curQueue);
  //       }
  //       solve();
  //     })();
  //   })

  // 构造任务队列
  const createQueue = (arr, level = 0) => {
    return arr.map((item) => {
      return createPromise(item, level);
    });
  };

  // 执行
  const curQueue = createQueue(items);

  runPromiseByQueue(curQueue);

  // // 循环执行
  // runPromiseByQueue(curQueue, 1);
})();

爱发电

本文标题:《【备忘】JavaScript 队列执行异步任务》作者:沉冰浮水
原文链接:https://www.wdssmq.com/post/20210529408.html
特别注明外均为原创,转载请注明。

分享到微信

扫描二维码

可在微信查看或分享至朋友圈。

相关文章

6度小K 6度小K 发布于 2010-10-20 10:01:19  
#cmt2501
我想结婚了……
回复
沉冰浮水 沉冰浮水 发布于 2010-10-19 19:38:00  
https://www.wdssmq.com
当然是为了个性些啊。。反正有自动填表插件。。
回复
Kada Kada 发布于 2010-10-19 17:33:14  
#cmt2499
你为什么搞个评论还有个性签名?
回复
发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

网站分类

  • 订阅本站的 RSS 2.0 新闻聚合

搜索

本周旧文

近期观影记录:超级马里奥,死侍与金刚狼。。

搬家也告一段落,虽然搬过来的东西还得归置,新衣柜虽说已经散俩月味儿了,但还是不想放衣服进去。

要不我每年汇总整理一次??碎雨集_沉冰浮水_第1页

所以,不带这条的话,2024 年目前只发了 13 条嘟????

VSCode 内 git 操作卡住的时候没办法主动取消一直是个痛点,一般都是推送或拉取,今天连提交都卡了。。

又一个夏天过去了,所以今年也没买防水鞋套;然后天凉了,为了应对踢被子买了睡袋,不知道 1.2 米会不会略窄。。

《五至七时的克莱奥》,2018 年 6 月加入列表,21 年 11 月底发现 B 站上线了这部,直到前几天才看完,还是分两次看的。。接下来有五项是 2019 年的,都是电影 —— 略长的待办列表。。

有用程序自动抓取自己带 tag 的嘟,然后按年备份后从线上删除;刚发现去年的数据有备份但是没删线上??和本地数据对比后发现线上的还少一条,Why??

本质上,每个人需要的是「让自己面临的问题得到解决」的能力。。

这又涉及到直接能力和间接能力,,缺乏直接能力很正常,视情况可以通过学习来掌握直接能力,或者「请」有直接能力的人来帮自己解决。。

缺乏间接能力的情况是真没救,尤其是对「这是**我自己**面临的问题」这一前提没有明确认知的人。。

其实,在认知意义上,焦虑时我知道这种情绪对应「焦虑」这个文法词汇,此外还有「压抑」「悲伤」等等,然而「抑郁」其实是个我认知体系外的词,虽然经常一些情绪感受我找不到对应的语言词汇来表述,却也只能将其实表述为「找不到对应的语言词汇来表述」的某些感受。。

爱发电支持者

最新留言

友情链接