给你n个异步任务队列,如何实现挂起和恢复,并且执行完后一起返回结果?

废话不说,以下便是实现代码,当然有很多不完善的地方,只是提供一个简单的思路

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <style>
      div {
        width: 200px;
        display: flex;
        justify-content: space-between;
        margin: 100px auto;
      }
    </style>
  </head>
  <body>
    <div>
      <button onclick="start()">开始</button>
      <button onclick="suspend()">暂停</button>
      <button onclick="resume()">继续</button>
    </div>
  </body>
  <script>
    function createTasks(num) {
      const tasks = [];
      for (let i = 0; i < num; i++) {
        tasks.push(
          () =>
            new Promise((resolve, reject) => {
              setTimeout(() => {
                resolve(i);
              }, 1500);
            })
        );
      }
      return tasks;
    }
    const process = Process();

    async function start() {
      const tasks = createTasks(10); //创建10个异步任务
      let result = await process.run(tasks);
      console.log("全部任务完成", result);
    }
    function suspend() {
      process.suspend();
    }
    function resume() {
      process.resume();
    }

    function Process() {
      let _resolve,
        _reject,
        currIndex = 0,
        _results = [],
        _tasks = null,
        _running = false;
      async function _start() {
        for (; currIndex < _tasks.length; currIndex++) {
          if (!_running) {
            return;
          }
          let rs = await _tasks[currIndex]();
          console.log(`完成了第${currIndex}个任务,结果是${rs}`);
          _results.push(rs);
        }
        _resolve(_results);
      }
      return {
        run(tasks) {
          if (!tasks) return;
          console.log("开始执行");
          return new Promise((resolve, reject) => {
            _resolve = resolve; //缓存resolve
            _reject = reject; //缓存reject, reject的情况未考虑
            _running = true;
            _tasks = tasks;
            _start();
          });
        },
        suspend() {
          console.log("挂起任务");
          _running = false;
        },
        resume() {
          console.log("重启任务");
          _running = true;
          _start();
        },
      };
    }
  </script>
</html>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值