给出一堆任务,依次执行,但是可以中断与恢复任务
首先需要提供一个函数start/stop来中断与开始(恢复)任务
设置
isRunning变量来判断当前是否在执行任务设置下标
i表示当前任务下标设置
result数组存储每次任务执行结果设置
prom定义最后一次任务执行结果调用
stop()函数时,- 如果有任务执行中,等待任务完成后,设置
isRunning = false
- 如果任务已经时最后一个,则无需执行
调用
start()函数时,- 按照当前下标执行任务,并把执行结果存入
result,以便返回任务结果
- 多次调用时,如果
prom不为空,直接返回prom最后一次任务执行结果
function processTask(tasks) { let isRunning = false; let i = 0; // 当前任务执行的下标 const result = []; // 存储任务执行结果 let prom = null; // 定义最后一次任务执行结果 return { start() { return new Promise(async (resolve, reject) => { if(prom) { // 如果有结果,直接返回,当前任务结束 prom.then(resolve, reject); return; } if(isRunning) { // 当前有task正在运行,多次调用无效 return; } isRunning = true; // 循环执行任务 while(i < tasks.length) { try { // 存储任务结果 console.log(i, '执行中'); result.push(await tasks[i]()); console.log(i, '执行完成'); } catch (error) { // 任务执行失败 isRunning = false; reject(error); prom = Promise.reject(error); return; } i++; if(!isRunning && i < tasks.length -1) { // 中断 console.log('执行中断'); return; } } // 全部执行完成 isRunning = false; resolve(result); prom = Promise.resolve(result) }) }, stop(){ isRunning = false; } } } const tasks = []; for(let i = 0; i< 5; i++) { tasks.push(() => { return new Promise((resolve) => { setTimeout(() => { resolve(i) }, 2000) }) }) } const processor = processTask(tasks); async function testStart(){ console.log('任务开始执行'); const result = await processor.start(); console.log('任务执行完成', result); } function testStop() { console.log('任务暂停执行'); processor.stop(); }