亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript模擬隊列的用法詳解

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

場景

場景一:

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

場景二:

在彈出第一個彈框并關閉后再彈第二個彈窗(或者廣告一類的)

我想這些需求大家應該都了解過,或者遇到過,我們可能第一反應是通過定時器或者Promise來處理,現在我告訴你完全可以通過隊列的方式來處理。我會寫一些示例,如果運用到工作中請根據自己的需求進行修改即可。

說明

JavaScript 隊列(Queue)是一種先進先出(FIFO)的數據結構,它用于存儲按順序排列的元素,并支持插入新元素和刪除元素的操作。隊列在計算機科學中有著廣泛的應用,例如在操作系統(tǒng)中實現任務調度、在數據壓縮中使用哈夫曼編碼等。在JavaScript中,隊列也常用于實現異步編程和控制流程。 JavaScript隊列通??梢酝ㄟ^內置的Array對象實現,或者使用第三方庫如queue-lib。Array對象提供了push()和shift()方法,可以模擬隊列的入隊和出隊操作。

簡單隊列

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

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

完整隊列

我們從該隊列中可以看出,我們可以去控制自己的并發(fā)量以及間隔時間了,那么我們在考慮下。如果隊列執(zhí)行完成了,我們怎么知道呢?等等。那我們就給他補充完全吧!(這只是我想到的,我沒考慮到的你們也可以自己完善哈)

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

補充完整隊列

我們在監(jiān)聽隊列是否完成的時候注意一個事,就是Promise在返回的時候一定要在成功的時候才返回。至于原因,你們可以自己去嘗試哈。

class RequestQueue {
    timer = null; // 定時器
    constructor(limit, delay) {
        this.limit = limit; // 最大并發(fā)請求數
        this.delay = delay; // 批次間隔時間(毫秒)
        this.queue = []; // 請求隊列
        this.running = 0; // 當前正在運行的請求數量
    }
    // 將請求添加到隊列中
    enqueue(request) {
        this.queue.push(request);
        this.run(); // 檢查是否可以運行新的請求
    }
    // 檢查并運行請求
    run() {
        while (this.running < this.limit && this.queue.length > 0) {
            const request = this.queue.shift();
            this.execute(request);
            this.running++;
        }
    }
    // 執(zhí)行請求
    execute(request) {
        request().finally(() => {
            this.running--;
            if (this.queue.length > 0) {
                setTimeout(() => {
                    this.run();
                }, this.delay);
            }
        });
    }
    // 監(jiān)聽隊列是否完成
    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);
        })
    }
}
// 模擬一個異步請求
function makeRequest(id) {
    return new Promise((resolve) => {
        console.log(`發(fā)起請求 ${id}`);
        setTimeout(() => {
            console.log(`請求 ${id} 完成`);
            resolve(id);
        }, 100);
    })
}
// 創(chuàng)建請求隊列并添加10,000個請求
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);
})

總結

以上就是JavaScript模擬隊列的基礎寫法用法,大家也可以根據你們的需要進行修改和完善。

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

相關文章

  • JavaScript日期選擇功能示例

    JavaScript日期選擇功能示例

    這篇文章主要介紹了JavaScript日期選擇功能,結合實例形式分析了javascript日期與時間相關操作技巧,需要的朋友可以參考下
    2017-01-01
  • js調用屏幕寬度的簡單方法

    js調用屏幕寬度的簡單方法

    下面小編就為大家?guī)硪黄猨s調用屏幕寬度的簡單方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • javascript實現表單驗證

    javascript實現表單驗證

    這篇文章主要介紹了javascript實現表單驗證的相關資料,以一個完整的實例對javascript實現表單驗證的方法進行分析,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 二級域名或跨域共享Cookies的實現方法

    二級域名或跨域共享Cookies的實現方法

    適用于Asp。 在主域名設置的Cookie,在各子域名共用;適用于博客等提供二級域名。這個問題,以網上有眾多帖子,可惜都沒有完整解決。
    2008-08-08
  • 淺談webpack4 圖片處理匯總

    淺談webpack4 圖片處理匯總

    這篇文章主要介紹了淺談webpack4 圖片處理匯總,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • js實現抽獎的兩種方法

    js實現抽獎的兩種方法

    這篇文章主要為大家詳細介紹了js實現抽獎的兩種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JavaScript制作樓層導航效果流程詳解

    JavaScript制作樓層導航效果流程詳解

    項目中遇到比較多的的文檔內容,為了方便查找里面的小內容,一般都會在左側或者右側放一個固定樓層的導航欄,今天就來說一下這個固定樓層導航欄的思路以及實現的方法
    2021-10-10
  • 完美實現八種js焦點輪播圖(上篇)

    完美實現八種js焦點輪播圖(上篇)

    這篇文章主要介紹了完美實現八種js焦點輪播圖的具體資料,基于完美運動框架move2.js而完成的八種焦點錄播圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 利用js正則表達式驗證手機號,email地址,郵政編碼

    利用js正則表達式驗證手機號,email地址,郵政編碼

    利用js正則表達式驗證手機號,email地址,郵政編碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • JavaScript 身份證號有效驗證詳解及實例代碼

    JavaScript 身份證號有效驗證詳解及實例代碼

    這篇文章主要介紹了JavaScript 身份證號有效驗證詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-10-10

最新評論