任务序列的中断与恢复

任务序列的中断与恢复

标签&分类
Javascript
发表时间
Mar 1, 2023 07:42 AM
描述
中断与恢复任务的执行,需要考虑到单个任务完成后,运行状态的判断
更新时间
Last updated March 7, 2023

给出一堆任务,依次执行,但是可以中断与恢复任务

首先需要提供一个函数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(); }