模拟浏览器同时发3个任务

描述:模拟浏览器同时发3个任务,每个请求完成之后自动开始下一个请求;
思路:递归

const tasks = [
  {
    id: "1",
    name: "残值",
    type: "accrual",
    createdAt: "2020-09-22T08:50:45.561+08:00",
  },
  {
    id: "2",
    name: "会员资料",
    type: "custom",
    createdAt: "2020-09-22T08:58:23.653+08:00",
  },
  {
    id: "3",
    name: "考勤记录",
    type: "attendance",
    createdAt: "2020-09-22T08:58:23.653+08:00",
  },
  {
    id: "4",
    name: "考勤记录",
    type: "attendance",
    createdAt: "2020-10-12T14:17:18.170+08:00",
  },
  {
    id: "5",
    name: "私教合同",
    type: "lessonOrder",
    createdAt: "2020-10-15T23:25:45.116+08:00",
  },
  {
    id: "6",
    name: "潜客资料",
    type: "latent",
    createdAt: "2020-10-15T23:26:05.847+08:00",
  },
  {
    id: "7",
    name: "考勤记录",
    type: "attendance",
    createdAt: "2020-10-15T23:40:20.074+08:00",
  },
  {
    id: "8",
    name: "考勤",
    type: "attendance",
    createdAt: "2020-10-19T15:07:04.217+08:00",
  },
];

async function mockAsyncTask(options) {
  return new Promise((resolve, reject) => {
    console.log(`开始处理任务${options.id}`);
    setTimeout(() => {
      console.log(`任务${options.id}已完成`);
      resolve("done");
    }, Math.random() * 10000);
  });
}

const handlers = {
  accrual: mockAsyncTask, // 残值
  custom: mockAsyncTask, // 会员
  latent: mockAsyncTask, // 潜客
  customCard: mockAsyncTask, // 会籍合同
  lessonOrder: mockAsyncTask, // 私教合同
  entrance: mockAsyncTask, // 入场记录
  portrait: mockAsyncTask, // 画像
  attendance: mockAsyncTask, // 考勤
};

async function runTasks(tasks, parallel = 3) {
  const res = null;
  let started = 0; // 记录已经处理的任务数量
  let finished = 0; // 记录已经完毕的任务数量

  function runSingleTask() {
    const running = started - finished; // 记录正在处理的任务数量
    if (running >= parallel) return;
    const task = tasks[started];
    if (!task) return;
    started++;
    handlers[task.type](task).then((res) => {
      finished++;
      if (started === finished) {
        console.log("全部执行完毕");
      } else {
        runSingleTask();
      }
    });
    runSingleTask();
  }
  runSingleTask();
}

runTasks(tasks);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值