描述:模拟浏览器同时发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);