最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于JS實(shí)現(xiàn)任務(wù)隊(duì)列的示例代碼

 更新時(shí)間:2023年08月25日 11:10:27   作者:編程三昧  
顧名思義,任務(wù)隊(duì)列就是存放任務(wù)的隊(duì)列,隊(duì)列中的任務(wù)都嚴(yán)格按照進(jìn)入隊(duì)列的先后順序執(zhí)行,所以下面我們就來(lái)看看如何基于JS實(shí)現(xiàn)任務(wù)隊(duì)列吧

引言

假設(shè)有這么一個(gè)場(chǎng)景:

  • 前端訂閱后臺(tái)數(shù)據(jù)的變化,如果發(fā)生變化,則觸發(fā)訂閱回調(diào);
  • 回調(diào)函數(shù)中,會(huì)執(zhí)行一些耗時(shí)操作,如:請(qǐng)求接口,發(fā)送短信,存歷史數(shù)據(jù)等;
  • 要求以上所有的操作都必須按照訂閱觸發(fā)的順序執(zhí)行;

我們都知道,回調(diào)本身就是一種異步操作,我們僅僅依靠訂閱回調(diào)無(wú)法保證回調(diào)中任務(wù)執(zhí)行順序的。

為了解決這個(gè)問(wèn)題,我們可以使用任務(wù)隊(duì)列,將回調(diào)函數(shù)添加到任務(wù)隊(duì)列中,然后按照順序依次執(zhí)行。

任務(wù)隊(duì)列的概念

顧名思義,任務(wù)隊(duì)列就是存放任務(wù)的隊(duì)列,隊(duì)列中的任務(wù)都嚴(yán)格按照進(jìn)入隊(duì)列的先后順序執(zhí)行。

在前一條任務(wù)執(zhí)行完畢后,立即執(zhí)行下一條任務(wù),直到任務(wù)隊(duì)列清空。

任務(wù)隊(duì)列的基本執(zhí)行流程如下:

  • 給任務(wù)隊(duì)列添加任務(wù),并判斷執(zhí)行標(biāo)識(shí);
  • 如果執(zhí)行標(biāo)識(shí)為 false,則將任務(wù)從隊(duì)列中獨(dú)立出來(lái);
  • 開(kāi)始執(zhí)行任務(wù),將執(zhí)行標(biāo)識(shí)置為 true;
  • 執(zhí)行完畢后,判斷隊(duì)列是否為空,如果不為空,則繼續(xù)執(zhí)行下一條任務(wù);
  • 直至任務(wù)隊(duì)列清空。

任務(wù)隊(duì)列一直在循環(huán)進(jìn)行如上步驟。

任務(wù)隊(duì)列的 JS 實(shí)現(xiàn)

我們選擇使用數(shù)組來(lái)維護(hù)隊(duì)列的執(zhí)行順序,按照“先進(jìn)先出“的原則,依次從數(shù)組的第一個(gè)元素開(kāi)始往后執(zhí)行。

簡(jiǎn)易代碼實(shí)現(xiàn)如下:

/** @format */
class TaskQueue {
    constructor() {
        this.queue = [];
        this.isRunning = false;
    }
    /**
     * @description 將任務(wù)添加至隊(duì)列
     * @param {Promise} queueFunction
     * @returns {undefined}
     */
    addQueue(queueFunction) {
        this.queue.push(queueFunction);
        if (!this.isRunning) {
            this.processQueue();
        }
    }
    /**
     * @description 如果隊(duì)列不為空,則開(kāi)始處理隊(duì)列中的任務(wù),本次任務(wù)執(zhí)行完畢后,立刻開(kāi)始下一條任務(wù)的執(zhí)行
     * @param {}
     */
    processQueue() {
        if (this.queue.length > 0) {
            this.isRunning = true;
            const queueFunction = this.queue.shift();
            queueFunction().finally(() => {
                this.processQueue();
            });
        } else {
            this.isRunning = false;
        }
    }
}

測(cè)試

我們使用如下代碼來(lái)測(cè)試上述實(shí)現(xiàn):

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("    任務(wù) 1");
};
let f2 = function (name) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`我是 f2`, name);
            resolve();
        }, 2000);
    });
};
let f22 = async function () {
    await f2("    任務(wù) 2");
};
let f3 = function (name) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`我是 f3`, name);
            resolve();
        }, 1000);
    });
};
let f33 = async function () {
    await f3("    任務(wù) 3");
};
taskQueue.addQueue(f11);
taskQueue.addQueue(f22);
taskQueue.addQueue(f33);
// 依次輸出:
// 我是 f1     任務(wù) 1
// 我是 f2     任務(wù) 2
// 我是 f3     任務(wù) 3

如果不使用任務(wù)隊(duì)列,上面的測(cè)試應(yīng)該是按照 f1 -> f2 -> f3 的順序執(zhí)行,但是使用了任務(wù)隊(duì)列之后,f1 -> f2 -> f3 的順序執(zhí)行被改變了,這是因?yàn)槿蝿?wù)隊(duì)列的執(zhí)行順序是按照添加的順序來(lái)的,而不是按照?qǐng)?zhí)行順序來(lái)的。

總結(jié)

任務(wù)隊(duì)列的實(shí)現(xiàn)非常簡(jiǎn)單,但是使用起來(lái)卻非常靈活,我們可以根據(jù)實(shí)際需求來(lái)決定任務(wù)隊(duì)列的執(zhí)行順序,也可以根據(jù)實(shí)際需求來(lái)決定任務(wù)隊(duì)列的執(zhí)行時(shí)機(jī)。

到此這篇關(guān)于基于JS實(shí)現(xiàn)任務(wù)隊(duì)列的示例代碼的文章就介紹到這了,更多相關(guān)JS任務(wù)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Canvas實(shí)現(xiàn)微信紅包照片效果

    Canvas實(shí)現(xiàn)微信紅包照片效果

    這篇文章主要為大家詳細(xì)介紹了Canvas實(shí)現(xiàn)微信紅包照片效果,用canvas及css3結(jié)合,實(shí)現(xiàn)紅包照片的效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • JavaScript iframe的相互操作淺析

    JavaScript iframe的相互操作淺析

    下面對(duì)iframe的所有操作都是在同一個(gè)域下進(jìn)行,暫不考慮跨域調(diào)用
    2009-10-10
  • JavsScript中Promise的錯(cuò)誤捕獲詳解

    JavsScript中Promise的錯(cuò)誤捕獲詳解

    怎么捕獲錯(cuò)誤并且處理是一門語(yǔ)言必備的知識(shí),在JavaScript中也是如此,下面這篇文章主要給大家介紹了關(guān)于JavsScript中Promise錯(cuò)誤捕獲的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • javascript中checkbox使用方法簡(jiǎn)單實(shí)例演示

    javascript中checkbox使用方法簡(jiǎn)單實(shí)例演示

    這篇文章通過(guò)簡(jiǎn)單的實(shí)例演示了javascript中checkbox使用方法,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 從axios源碼角度解決bug的過(guò)程記錄

    從axios源碼角度解決bug的過(guò)程記錄

    這篇文章主要為大家介紹了從axios源碼角度解決bug的過(guò)程記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 兼容IE,firefox的獲取節(jié)點(diǎn)的文本值的javascript代碼

    兼容IE,firefox的獲取節(jié)點(diǎn)的文本值的javascript代碼

    javascript獲取節(jié)點(diǎn)的文本值,已經(jīng)考慮了兼容性。大家可以放心使用。注意了這里的兼容沒(méi)有使用innerText,如果要使用兼容innerText,請(qǐng)參考腳本之家以前發(fā)布的文章。
    2009-12-12
  • 微信小程序簽到功能

    微信小程序簽到功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序簽到功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺談javascript中return語(yǔ)句

    淺談javascript中return語(yǔ)句

    這篇文章主要給大家簡(jiǎn)單介紹了javascript中return語(yǔ)句,有需要的小伙伴可以參考下。
    2015-07-07
  • JavaScript正則表達(dá)式替換字符串中圖片地址(img src)的方法

    JavaScript正則表達(dá)式替換字符串中圖片地址(img src)的方法

    這篇文章主要介紹了JavaScript正則表達(dá)式替換字符串中圖片地址(img src)的方法,結(jié)合實(shí)例形式分析了JS正則替換的常用技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-01-01
  • 前端JavaScript經(jīng)典之Promise詳解

    前端JavaScript經(jīng)典之Promise詳解

    Promise是為了解決回調(diào)地獄問(wèn)題而誕生的,它提供了優(yōu)雅的異步回調(diào)解決方案,這篇文章主要介紹了前端JavaScript經(jīng)典之Promise的相關(guān)資料,需要的朋友可以參考下
    2024-09-09

最新評(píng)論

扎鲁特旗| 克什克腾旗| 都安| 喜德县| 土默特右旗| 崇礼县| 根河市| 平安县| 万载县| 霸州市| 鄂尔多斯市| 若羌县| 清水县| 嘉兴市| 焉耆| 乌兰浩特市| 瑞金市| 东明县| 兰坪| 沙坪坝区| 五华县| 利辛县| 东乡族自治县| 大邑县| 南靖县| 子长县| 嘉兴市| 溧阳市| 灵宝市| 云阳县| 辽阳市| 荆门市| 锡林浩特市| 温州市| 陕西省| 宁远县| 梅河口市| 榆中县| 洛阳市| 巴彦淖尔市| 五寨县|