中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中的Promise.race控制并發量應用

發布時間:2023-05-08 17:59:27 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

這篇文章主要講解了“JS中的Promise.race控制并發量應用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JS中的Promise.race控制并發量應用”吧!

一、Promise.race

Promise.race 作用就是將多個異步任務包裹起來,當有一個完成的話,那么就會觸發 then 事件。除了這個不錯的特性方法外,await 這個關鍵字也比較有用,可以這樣理解,await 后面的代碼其實就相當于在 Promisethen 事件,即:如果異步任務沒有完成的話,await 后面的邏輯是不會執行的,可以聯想一下 generator 生成器里面的 yield 它能直接控制方法體里面的代碼執行跟暫停,外界由一個迭代器 next 方法進行操控。

await 雖然好用,也只是在一個“異步”方法里需要“同步執行”的時候。then 的異步回調,其實也有它的用處。可以將完全不關心的事務放到里面,由它去執行到最后的結果。

二、并發效果展示

JS中的Promise.race控制并發量應用

三、代碼

class ConcurrencyTask {
    // 回調
    callBack = ()=>{}
    // 任務
    task = ()=>{}
    // 異步任務
    promse = null
    constructor(task,callBack){
        this.task = task
        this.callBack = callBack
    }
    // 開始進行任務
    beginExecuteTask(){
        this.promse = new Promise((resolve, reject)=>{
            this.task(resolve,reject)
        })
        return this.promse
    }
    // 類方法初始化
    static SimulationTask(time){
        return new ConcurrencyTask((resolve, _)=>{
                console.log('開始執行延時任務:' + (time / 1000) + '秒!')
                setTimeout(()=>{
                    resolve('延時任務完成:' + (time / 1000) + '秒!')
                },time)
            },(res)=>{
                console.log(res)
        })
    }
}
class ConcurrencyQueue {
    // 最大并發數
    maxConcurrencyNum = 1
    // 并發任務集合
    concurrencyTasks = []
    // 正在進行的任務
    executionTasks = []
    constructor(maxConcurrencyNum,...concurrencyTasks){
        this.maxConcurrencyNum = maxConcurrencyNum
        concurrencyTasks.forEach((task)=>{
            this.concurrencyTasks.push(task)
        })
    }
    // 開始執行
    async beginExecuteTasks(){
        // 當前執行任務
        this.executionTasks = []
        // 全部任務
        let allExecutionTasks = []
        for(let index = 0;index < this.concurrencyTasks.length;index ++){
            let task = this.concurrencyTasks[index]
            // 開始并進行后續追蹤
            task.beginExecuteTask().then((res)=>{
                this.executionTasks.splice(this.executionTasks.indexOf(task),1)
                if(task.callBack){
                    task.callBack(res)
                }
            })
            // 不足直接添加
            if(this.executionTasks.length < this.maxConcurrencyNum){
                //待執行任務集合添加
                this.executionTasks.push(task)
                //全任務執行集合添加
                allExecutionTasks.push(task)
                if((this.concurrencyTasks.length - 1) == index || this.executionTasks.length >= this.maxConcurrencyNum){
                    // 滿足直接運行
                    await Promise.race(this.executionTasks.map((task)=>{ return task.promse }))
                }
            }
        }
        //全部任務完成
        await Promise.all(allExecutionTasks.map((task)=>{ return task.promse }))
        console.log('任務全部完成')
    }
}
export { ConcurrencyTask ,ConcurrencyQueue }

ESM 模式導入,需要 node 簡單起一個服務

<script type="module">
    import { ConcurrencyTask ,ConcurrencyQueue } from "./concurrencyTask.js"
    //添加任務
    let concurrencyQueue = new ConcurrencyQueue(3,ConcurrencyTask.SimulationTask(1000),ConcurrencyTask.SimulationTask(6000),ConcurrencyTask.SimulationTask(5000),ConcurrencyTask.SimulationTask(4000),ConcurrencyTask.SimulationTask(2000),ConcurrencyTask.SimulationTask(3000))
    //開始執行任務
    concurrencyQueue.beginExecuteTasks()
</script>

感謝各位的閱讀,以上就是“JS中的Promise.race控制并發量應用”的內容了,經過本文的學習后,相信大家對JS中的Promise.race控制并發量應用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巩义市| 隆德县| 湾仔区| 扎鲁特旗| 清镇市| 安达市| 连云港市| 天长市| 土默特右旗| 贺兰县| 疏附县| 公主岭市| 通化市| 新平| 松江区| 甘德县| 邹平县| 兰西县| 德庆县| 时尚| 郧西县| 玉树县| 望奎县| 建水县| 黄大仙区| 德化县| 武夷山市| 高州市| 栖霞市| 平昌县| 工布江达县| 乡宁县| 苗栗县| 东光县| 崇信县| 陇南市| 安阳县| 泸西县| 南丰县| 祁连县| 封丘县|