基于JS实现任务队列的示例代码

 更新时间:2023年08月25日 11:10:27   作者:编程三昧  
顾名思义,任务队列就是存放任务的队列,队列中的任务都严格按照进入队列的先后顺序执行,所以下面我们就来看看如何基于JS实现任务队列吧

引言

假设有这么一个场景:

  • 前端订阅后台数据的变化,如果发生变化,则触发订阅回调;
  • 回调函数中,会执行一些耗时操作,如:请求接口,发送短信,存历史数据等;
  • 要求以上所有的操作都必须按照订阅触发的顺序执行;

我们都知道,回调本身就是一种异步操作,我们仅仅依靠订阅回调无法保证回调中任务执行顺序的。

为了解决这个问题,我们可以使用任务队列,将回调函数添加到任务队列中,然后按照顺序依次执行。

任务队列的概念

顾名思义,任务队列就是存放任务的队列,队列中的任务都严格按照进入队列的先后顺序执行。

在前一条任务执行完毕后,立即执行下一条任务,直到任务队列清空。

任务队列的基本执行流程如下:

  • 给任务队列添加任务,并判断执行标识;
  • 如果执行标识为 false,则将任务从队列中独立出来;
  • 开始执行任务,将执行标识置为 true;
  • 执行完毕后,判断队列是否为空,如果不为空,则继续执行下一条任务;
  • 直至任务队列清空。

任务队列一直在循环进行如上步骤。

任务队列的 JS 实现

我们选择使用数组来维护队列的执行顺序,按照“先进先出“的原则,依次从数组的第一个元素开始往后执行。

简易代码实现如下:

/** @format */
class TaskQueue {
    constructor() {
        this.queue = [];
        this.isRunning = false;
    }
    /**
     * @description 将任务添加至队列
     * @param {Promise} queueFunction
     * @returns {undefined}
     */
    addQueue(queueFunction) {
        this.queue.push(queueFunction);
        if (!this.isRunning) {
            this.processQueue();
        }
    }
    /**
     * @description 如果队列不为空,则开始处理队列中的任务,本次任务执行完毕后,立刻开始下一条任务的执行
     * @param {}
     */
    processQueue() {
        if (this.queue.length > 0) {
            this.isRunning = true;
            const queueFunction = this.queue.shift();
            queueFunction().finally(() => {
                this.processQueue();
            });
        } else {
            this.isRunning = false;
        }
    }
}

测试

我们使用如下代码来测试上述实现:

let taskQueue = new TaskQueue();
let f1 = function (name) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`我是 f1`, name);
            resolve();
        }, 3000);
    });
};
let f11 = async function () {
    await f1("    任务 1");
};
let f2 = function (name) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`我是 f2`, name);
            resolve();
        }, 2000);
    });
};
let f22 = async function () {
    await f2("    任务 2");
};
let f3 = function (name) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`我是 f3`, name);
            resolve();
        }, 1000);
    });
};
let f33 = async function () {
    await f3("    任务 3");
};
taskQueue.addQueue(f11);
taskQueue.addQueue(f22);
taskQueue.addQueue(f33);
// 依次输出:
// 我是 f1     任务 1
// 我是 f2     任务 2
// 我是 f3     任务 3

如果不使用任务队列,上面的测试应该是按照 f1 -> f2 -> f3 的顺序执行,但是使用了任务队列之后,f1 -> f2 -> f3 的顺序执行被改变了,这是因为任务队列的执行顺序是按照添加的顺序来的,而不是按照执行顺序来的。

总结

任务队列的实现非常简单,但是使用起来却非常灵活,我们可以根据实际需求来决定任务队列的执行顺序,也可以根据实际需求来决定任务队列的执行时机。

到此这篇关于基于JS实现任务队列的示例代码的文章就介绍到这了,更多相关JS任务队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Canvas实现微信红包照片效果

    Canvas实现微信红包照片效果

    这篇文章主要为大家详细介绍了Canvas实现微信红包照片效果,用canvas及css3结合,实现红包照片的效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • JavaScript iframe的相互操作浅析

    JavaScript iframe的相互操作浅析

    下面对iframe的所有操作都是在同一个域下进行,暂不考虑跨域调用
    2009-10-10
  • JavsScript中Promise的错误捕获详解

    JavsScript中Promise的错误捕获详解

    怎么捕获错误并且处理是一门语言必备的知识,在JavaScript中也是如此,下面这篇文章主要给大家介绍了关于JavsScript中Promise错误捕获的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • javascript中checkbox使用方法简单实例演示

    javascript中checkbox使用方法简单实例演示

    这篇文章通过简单的实例演示了javascript中checkbox使用方法,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • 从axios源码角度解决bug的过程记录

    从axios源码角度解决bug的过程记录

    这篇文章主要为大家介绍了从axios源码角度解决bug的过程记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 兼容IE,firefox的获取节点的文本值的javascript代码

    兼容IE,firefox的获取节点的文本值的javascript代码

    javascript获取节点的文本值,已经考虑了兼容性。大家可以放心使用。注意了这里的兼容没有使用innerText,如果要使用兼容innerText,请参考脚本之家以前发布的文章。
    2009-12-12
  • 微信小程序签到功能

    微信小程序签到功能

    这篇文章主要为大家详细介绍了微信小程序签到功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 浅谈javascript中return语句

    浅谈javascript中return语句

    这篇文章主要给大家简单介绍了javascript中return语句,有需要的小伙伴可以参考下。
    2015-07-07
  • JavaScript正则表达式替换字符串中图片地址(img src)的方法

    JavaScript正则表达式替换字符串中图片地址(img src)的方法

    这篇文章主要介绍了JavaScript正则表达式替换字符串中图片地址(img src)的方法,结合实例形式分析了JS正则替换的常用技巧与注意事项,需要的朋友可以参考下
    2017-01-01
  • 前端JavaScript经典之Promise详解

    前端JavaScript经典之Promise详解

    Promise是为了解决回调地狱问题而诞生的,它提供了优雅的异步回调解决方案,这篇文章主要介绍了前端JavaScript经典之Promise的相关资料,需要的朋友可以参考下
    2024-09-09

最新评论