实现一个简单的串行任务调度器(控制任务队列执行顺序及支持暂停任务队列执行)

前言:

在计算机系统中,任务调度是一项关键的管理任务的技术。它通过合理地安排和管理任务的执行顺序和时间,以提高系统的性能、资源利用率和响应时间。

本文将介绍一个基于 JavaScript 实现的串行任务调度器,探讨其作用、原理。

代码需求

实现一个任务调度器,提供串行执行任务能力异步任务处理中断任务队列执行

代码实现

js 复制代码
class TPromise {
 taskList = [];
 currentRes = "";
 stop = false;
 // 任务添加
 addTask(fn, pause = false) {
   this.taskList.push({
     fn,
     pause,
   });
 }
 // 任务执行
 executeTask(d = "") {
   if (this.taskList.length && !this.stop) {
     this.resolvePromise(this.taskList[0].fn, d)
       .then((res) => {
         if (this.taskList[0].pause) this.stopCh();
         this.taskList.shift();
         this.currentRes = res;
         this.stopCh(this.currentRes);
       })
       .catch(() => {
         this.stopTask();
       });
   }
 }
 // 任务重启
 nextTask() {
   this.stopCh(false);
   this.executeTask(this.currentRes);
 }
 // 任务状态更新
 stopCh(bool = true) {
   this.stop = bool;
 }
 resolvePromise(fn, d) {
   let resP = new Promise((resolve, reject) => {
     let p = fn(d);
     if (p instanceof Promise) {
       p.then((res) => {
         resolve(res);
       }).then((rej) => {
         reject(rej);
       });
     } else if (
       (typeof fn === "object" || typeof fn === "function") &&
       fn !== null
     ) {
       let then = fn.then;
       if (then) {
         then.call(fn, resolve, reject);
       } else {
         fn(d, resolve, reject);
       }
     } else {
       resolve(fn);
     }
   });
   return resP;
 }
}

代码解析

上述代码实现了一个名为 TPromise 的任务调度器。它采用了基于 Promise 的异步编程模型,通过添加任务到任务列表中,并按照添加顺序依次执行任务。具体的原理如下:

  1. 任务添加 :通过 addTask 方法,可以向任务列表中添加任务。每个任务由一个函数 fn 表示,可以根据需要传入参数pause选择是否在执行该任务后暂停任务调度器。
  2. 任务执行 :通过 executeTask 方法,任务调度器会按照任务列表中的顺序执行任务。如果任务列表不为空且任务调度器未被停止,则会执行任务列表中的第一个任务,当成功之后,会校验当前是否需要暂停任务,并将执行结果保存到 currentRes 变量中。 同时消费当前执行的任务,基于暂存的执行结果继续递归执行 executeTask
  3. 任务停止和重启状态更新 :通过 stopCh 方法,可以控制任务调度器的停止状态。传入 true 表示停止任务调度器,传入 false 表示恢复任务调度器的执行。
  4. 任务重启执行 :通过 nextTask 方法,先执行 stopCh更新任务状态,通过暂存的 currentRes 重启任务调度器,继续执行下一个任务。
  5. Promise 处理 :通过 resolvePromise 方法,任务调度器处理任务函数的返回值。 resolvePromise函数返回的是一个 Promise 对象,会对各种类型的任务进行处理,包括常量,promise,thenable,函数等。

结尾:

总的来说,这个基于JavaScript的任务调度器实现了串行执行任务、异步任务处理以及中断任务队列执行等功能。

我们也可以在此基础上进行扩展,添加更多的功能和特性,使任务调度器更加强大和实用。

相关推荐
CharlesYu011 天前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端
平头哥技术团队1 天前
Day 21 _ 页内锚点_给每段起个 id,目录写 href=_#id_,点一下页面就滚到那一段
前端·html·html5
子兮曰1 天前
Bun v1.4.1 深度解析:从 Zig 到 Rust,一场 11 天、64 个 AI 代理的语言迁徙
前端·后端·bun
人民广场吃泡面1 天前
什么是AI Agent?它又能给前端带来哪些效率提升?
前端·人工智能
中科三方1 天前
两家域名注册商资质被ICANN终止:企业域名资产安全再受关注
前端·网络·安全·域名
bug总结1 天前
uniapp vue3全局方法注册使用
前端·javascript·uni-app
华无丽言1 天前
如何在宜搭中实现获取子表中的字段值赋值到父表中?
前端·javascript·低代码
IT_陈寒1 天前
Vue的computed属性竟然坑了我一把
前端·人工智能·后端
威斯软科的老司机1 天前
通俗讲解 CNN 图像识别、向量 Embedding、Softmax 概率计算这三块的简化原理
前端·人工智能·ui·数字孪生
2601_962382431 天前
剑指大前端全栈工程师(全2册)主要情节
javascript·实战案例·全栈工程师·剑指大前端·html5+css3