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

JavaScript模擬隊(duì)列的用法詳解

 更新時(shí)間:2023年10月09日 08:25:24   作者:霧戀  
我原本以為JavaScript是不能寫(xiě)隊(duì)列的,最近發(fā)現(xiàn)JavaScript是可以模擬隊(duì)列的,并且花樣還挺多,所以本文將給大家介紹JavaScript模擬隊(duì)列的基礎(chǔ)寫(xiě)法用法,需要的朋友可以參考下

場(chǎng)景

場(chǎng)景一:

有幾百條數(shù)據(jù)需要傳遞給后端,但是后端每次最多只能接收10條數(shù)據(jù)

場(chǎng)景二:

在彈出第一個(gè)彈框并關(guān)閉后再?gòu)椀诙€(gè)彈窗(或者廣告一類(lèi)的)

我想這些需求大家應(yīng)該都了解過(guò),或者遇到過(guò),我們可能第一反應(yīng)是通過(guò)定時(shí)器或者Promise來(lái)處理,現(xiàn)在我告訴你完全可以通過(guò)隊(duì)列的方式來(lái)處理。我會(huì)寫(xiě)一些示例,如果運(yùn)用到工作中請(qǐng)根據(jù)自己的需求進(jìn)行修改即可。

說(shuō)明

JavaScript 隊(duì)列(Queue)是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),它用于存儲(chǔ)按順序排列的元素,并支持插入新元素和刪除元素的操作。隊(duì)列在計(jì)算機(jī)科學(xué)中有著廣泛的應(yīng)用,例如在操作系統(tǒng)中實(shí)現(xiàn)任務(wù)調(diào)度、在數(shù)據(jù)壓縮中使用哈夫曼編碼等。在JavaScript中,隊(duì)列也常用于實(shí)現(xiàn)異步編程和控制流程。 JavaScript隊(duì)列通常可以通過(guò)內(nèi)置的Array對(duì)象實(shí)現(xiàn),或者使用第三方庫(kù)如queue-lib。Array對(duì)象提供了push()和shift()方法,可以模擬隊(duì)列的入隊(duì)和出隊(duì)操作。

簡(jiǎn)單隊(duì)列

我們從下面的模擬隊(duì)列中可以看出,我們?cè)趫?zhí)行的時(shí)候makeRequest(模擬請(qǐng)求)是依次開(kāi)始執(zhí)行,那么我們想同時(shí)執(zhí)行多個(gè)請(qǐng)求呢?我們想間隔一段時(shí)間在發(fā)送請(qǐng)求呢?那我們接到看下面這個(gè)示例。

class RequestQueue {
    constructor() {
        this.queue = []; // 請(qǐng)求隊(duì)列
        this.running = 0; // 當(dāng)前正在運(yùn)行的請(qǐng)求數(shù)量
    }
    // 將請(qǐng)求添加到隊(duì)列中
    enqueue(request) {
        this.queue.push(request);
        this.run(); // 檢查是否可以運(yùn)行新的請(qǐng)求
    }
    // 檢查并運(yùn)行請(qǐng)求
    run() {
        if (this.running !== 0 || !this.queue.length) return;
        const request = this.queue.shift();
        this.execute(request);
        this.running++;
    }
    // 執(zhí)行請(qǐng)求
    execute(request) {
        request().finally(() => {
            this.running--;
            if (this.queue.length <= 0) return;
            this.run();
        });
    }
}
// 模擬一個(gè)異步請(qǐng)求
function makeRequest(id) {
    return new Promise((resolve) => {
        console.log(`正在發(fā)送請(qǐng)求 ${id}`);
        setTimeout(() => {
            console.log(`請(qǐng)求 ${id} 完成`);
            resolve(id);
        }, 1000);
    })
}
// 創(chuàng)建請(qǐng)求隊(duì)列并添加10個(gè)請(qǐng)求
const queue = new RequestQueue(1, 100);
for (let i = 1; i <= 10; i++) {
    queue.enqueue(async () => await makeRequest(i));
};

完整隊(duì)列

我們從該隊(duì)列中可以看出,我們可以去控制自己的并發(fā)量以及間隔時(shí)間了,那么我們?cè)诳紤]下。如果隊(duì)列執(zhí)行完成了,我們?cè)趺粗滥兀康鹊?。那我們就給他補(bǔ)充完全吧?。ㄟ@只是我想到的,我沒(méi)考慮到的你們也可以自己完善哈)

class RequestQueue {
    constructor(limit,delay) {
        this.limit = limit; // 最大并發(fā)請(qǐng)求數(shù)
        this.delay = delay; // 批次間隔時(shí)間(毫秒)
        this.queue = []; // 請(qǐng)求隊(duì)列
        this.running = 0; // 當(dāng)前正在運(yùn)行的請(qǐng)求數(shù)量
    }
    // 將請(qǐng)求添加到隊(duì)列中
    enqueue(request) {
        this.queue.push(request);
        this.run(); // 檢查是否可以運(yùn)行新的請(qǐng)求
    }
    // 檢查并運(yùn)行請(qǐng)求
    run() {
        while (this.running < this.limit && this.queue.length > 0) {
            const request = this.queue.shift();
            this.execute(request);
            this.running++;
        }
    }
    // 執(zhí)行請(qǐng)求
    execute(request) {
        request().finally(() => {
            this.running--;
            if (this.queue.length > 0) {
                setTimeout(() => {
                this.run();
                }, this.delay);
            }
        });
    }
}
// 模擬一個(gè)異步請(qǐng)求
function makeRequest(id) {
    return new Promise((resolve) => {
        console.log(`發(fā)起請(qǐng)求 ${id}`);
        setTimeout(() => {
            console.log(`請(qǐng)求 ${id} 完成`);
            resolve(id);
        }, 100);
    })
}
// 創(chuàng)建請(qǐng)求隊(duì)列并添加10,000個(gè)請(qǐng)求
const queue = new RequestQueue(5,1000);
for (let i = 1; i <= 20; i++) {
    queue.enqueue(async () => await makeRequest(i));
};

補(bǔ)充完整隊(duì)列

我們?cè)诒O(jiān)聽(tīng)隊(duì)列是否完成的時(shí)候注意一個(gè)事,就是Promise在返回的時(shí)候一定要在成功的時(shí)候才返回。至于原因,你們可以自己去嘗試哈。

class RequestQueue {
    timer = null; // 定時(shí)器
    constructor(limit, delay) {
        this.limit = limit; // 最大并發(fā)請(qǐng)求數(shù)
        this.delay = delay; // 批次間隔時(shí)間(毫秒)
        this.queue = []; // 請(qǐng)求隊(duì)列
        this.running = 0; // 當(dāng)前正在運(yùn)行的請(qǐng)求數(shù)量
    }
    // 將請(qǐng)求添加到隊(duì)列中
    enqueue(request) {
        this.queue.push(request);
        this.run(); // 檢查是否可以運(yùn)行新的請(qǐng)求
    }
    // 檢查并運(yùn)行請(qǐng)求
    run() {
        while (this.running < this.limit && this.queue.length > 0) {
            const request = this.queue.shift();
            this.execute(request);
            this.running++;
        }
    }
    // 執(zhí)行請(qǐng)求
    execute(request) {
        request().finally(() => {
            this.running--;
            if (this.queue.length > 0) {
                setTimeout(() => {
                    this.run();
                }, this.delay);
            }
        });
    }
    // 監(jiān)聽(tīng)隊(duì)列是否完成
    isQueueEmpty() {
        return new Promise((resolve, reject) => {
            this.timer = setInterval(() => {
                if (this.queue.length === 0 && this.running === 0) {
                    clearInterval(this.timer);
                    this.timer = null;
                    resolve(true);
                }
            }, 1000);
        })
    }
}
// 模擬一個(gè)異步請(qǐng)求
function makeRequest(id) {
    return new Promise((resolve) => {
        console.log(`發(fā)起請(qǐng)求 ${id}`);
        setTimeout(() => {
            console.log(`請(qǐng)求 ${id} 完成`);
            resolve(id);
        }, 100);
    })
}
// 創(chuàng)建請(qǐng)求隊(duì)列并添加10,000個(gè)請(qǐng)求
const queue = new RequestQueue(5, 1000);
for (let i = 1; i <= 20; i++) {
    queue.enqueue(async () => await makeRequest(i));
};
// 執(zhí)行完成返回ture
queue.isQueueEmpty().then(res=>{
    console.log(res);
})

總結(jié)

以上就是JavaScript模擬隊(duì)列的基礎(chǔ)寫(xiě)法用法,大家也可以根據(jù)你們的需要進(jìn)行修改和完善。

到此這篇關(guān)于JavaScript模擬隊(duì)列的用法詳解的文章就介紹到這了,更多相關(guān)JavaScript模擬隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript AOP編程實(shí)例

    JavaScript AOP編程實(shí)例

    這篇文章主要介紹了JavaScript AOP編程,實(shí)例分析了javascript實(shí)現(xiàn)AOP編程的基本技巧,需要的朋友可以參考下
    2015-06-06
  • 怎么在下面的HTML里調(diào)用數(shù)組cs[]的值

    怎么在下面的HTML里調(diào)用數(shù)組cs[]的值

    怎么在下面的HTML里調(diào)用數(shù)組cs[]的值...
    2007-01-01
  • ckeditor一鍵排版功能實(shí)現(xiàn)方法分析

    ckeditor一鍵排版功能實(shí)現(xiàn)方法分析

    這篇文章主要介紹了ckeditor一鍵排版功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了ckeditor一鍵排版相關(guān)擴(kuò)展插件定義、配置與使用方法,需要的朋友可以參考下
    2020-02-02
  • js定時(shí)器不準(zhǔn)確問(wèn)題的解決方法

    js定時(shí)器不準(zhǔn)確問(wèn)題的解決方法

    本文主要介紹了js定時(shí)器不準(zhǔn)確問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • javascript之大字符串的連接的StringBuffer 類(lèi)

    javascript之大字符串的連接的StringBuffer 類(lèi)

    javascript之大字符串的連接的StringBuffer 類(lèi)...
    2007-05-05
  • 微信小程序?qū)崿F(xiàn)聊天室功能

    微信小程序?qū)崿F(xiàn)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • JS判斷是否為JSON對(duì)象及是否存在某字段的方法(推薦)

    JS判斷是否為JSON對(duì)象及是否存在某字段的方法(推薦)

    下面小編就為大家?guī)?lái)一篇JS判斷是否為JSON對(duì)象及是否存在某字段的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 使用layui的layer組件做彈出層的例子

    使用layui的layer組件做彈出層的例子

    今天小編就為大家分享一篇使用layui的layer組件做彈出層的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • canvas實(shí)現(xiàn)愛(ài)心和彩虹雨效果

    canvas實(shí)現(xiàn)愛(ài)心和彩虹雨效果

    本文主要介紹了canvas實(shí)現(xiàn)愛(ài)心和彩虹雨效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • js的es6常用新特性詳解

    js的es6常用新特性詳解

    ES6(ECMAScript 6,也稱(chēng)為ES2015)是JavaScript的一個(gè)重要更新版本,引入了許多新的語(yǔ)言特性和改進(jìn),使得JavaScript變得更加現(xiàn)代化、易讀、易維護(hù)和更適合大型應(yīng)用程序的開(kāi)發(fā),ES6的主要變化歸納為:語(yǔ)法糖、新機(jī)制、更好的語(yǔ)義、更多的內(nèi)置對(duì)象和方法
    2023-11-11

最新評(píng)論

夹江县| 会宁县| 峨眉山市| 龙陵县| 彝良县| 东兴市| 将乐县| 新宾| 巢湖市| 通渭县| 潍坊市| 南安市| 樟树市| 老河口市| 哈巴河县| 新巴尔虎左旗| 营口市| 馆陶县| 离岛区| 嘉义市| 宁安市| 象山县| 诸城市| 车致| 北川| 旺苍县| 宜城市| 凉山| 惠安县| 夹江县| 海伦市| 海南省| 武安市| 舒兰市| 高要市| 江川县| 萝北县| 桐庐县| 如皋市| 鄂托克前旗| 双桥区|