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

JS異步任務(wù)的并行、串行及二者結(jié)合用法

 更新時間:2023年10月27日 09:13:56   作者:路澤宇  
讓多個異步任務(wù)按照我們的想法執(zhí)行,是開發(fā)中常見的需求,今天我們就來捋一下,如何讓多個異步任務(wù)并行,串行,以及并行串行相結(jié)合,感興趣的朋友跟隨小編一起看看吧

讓多個異步任務(wù)按照我們的想法執(zhí)行,是開發(fā)中常見的需求。今天我們就來捋一下,如何讓多個異步任務(wù)并行,串行,以及并行串行相結(jié)合。

一、并行

并行是使用最多的方式,多個相互間沒有依賴關(guān)系的異步任務(wù),并行執(zhí)行能夠提高效率。

我們最經(jīng)常用的,是Promise.all() 。

function f1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('1結(jié)束');
            resolve();
        }, 1000)
    });
}
function f2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('2結(jié)束');
            resolve();
        }, 900)
    });
}
function f3() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('3結(jié)束');
            resolve();
        }, 800)
    });
}

let arr = [f1, f2, f3];
Promise.all(arr.map(i => i()));
// 3結(jié)束
// 2結(jié)束
// 1結(jié)束

以下幾種數(shù)組遍歷方式,同樣可以實現(xiàn)并行。

// forEach遍歷
arr.forEach(item => {
    item();
});
// for循環(huán)
for (let i = 0; i < arr.length; i++) {
    arr[i]();
}
// for...of遍歷
for (let item of arr) {
    item();
}

// 注意,以下兩種寫法同樣是并行的
arr.forEach(async item => await item());

async function f() {
    arr.forEach(async item => await item())
}
f();

相比之下,Promise.all()可以確保任務(wù)都執(zhí)行成功,然后再執(zhí)行后續(xù)操作,這是各種遍歷無法做到的。

另外,還有一種方式也能實現(xiàn)并行:Promise.allSettled()。

Promise.allSettled(arr.map(i => i()));

這種方式很特別,它無法得到每個Promise對象的返回值,卻可以精確得知每個任務(wù)的成功還是失敗。如果你有這樣的需求場景,用Promise.allSettled()就很合適。

二、串行

我在工作中遇到過一個場景,一個有1000+元素的數(shù)組,每個成員都是調(diào)用第三方接口的Promise對象。我像往常一樣得意的使用Promise.all(),等著1000多個任務(wù)瞬間完成。然而,結(jié)果卻讓我大跌眼鏡,這1000多個任務(wù),只有一部分成功了,大部分都報錯了。不管我執(zhí)行幾次,結(jié)果都是這個樣。一籌莫展之后,我才從第三方那兒得知,他們的接口是有調(diào)用限制的,一個接口同一時間只能并行300個。

有沒有辦法能讓它們一個接一個的執(zhí)行呢?也就是串行。

nodejs koa框架的next()語法給了我啟發(fā),它就是讓中間件一個接一個的執(zhí)行。于是我想出了遞歸的方式:

async function serial(arr) {
    let item = arr.shift();

    await item();
    if (arr.length > 0) {
        await serial(arr);
    }
}
serial(arr);
// 1結(jié)束
// 2結(jié)束
// 3結(jié)束

其實,想讓異步任務(wù)串行,不用這么麻煩。以下遍歷的方式,同樣可以實現(xiàn)串行。

// 使用for...of
async function f() {
    for (let item of arr) {
        await item();
    }
}
f();

// 使用for循環(huán)
async function f() {
    for (let i = 0; i < arr.length; i++) {
        await arr[i]();
    }
}
f();

發(fā)現(xiàn)了沒?為什么同樣是for循環(huán),同樣是for...of,前面的寫法是并行,后面就成了串行呢?

工作中,我們一定做過這樣的嘗試,想通過遍歷,來讓多個異步任務(wù)串行。但往往不得其法,怎么折騰它們都還是同時執(zhí)行。

后一種寫法,你可以理解為:await執(zhí)行完成后,才會進(jìn)入下一次循環(huán)。 其實,遍歷,就相當(dāng)于把每一個元素,在代碼中從上到下寫下來。當(dāng)它們處于async函數(shù)中,并在每個元素前面加await,它們自然就能順序執(zhí)行。否則,我們都知道,簡單的順序?qū)懴聛淼漠惒饺蝿?wù),它們還是同時執(zhí)行的。

好了,現(xiàn)在程序不報錯了。但是,1000多個任務(wù)依次執(zhí)行完成,足足花了十多分鐘,太慢了!有沒有辦法,又快又不觸發(fā)接口調(diào)用限制呢?

有,如果可以并行200個任務(wù),完成后再開始下一輪200個......也就是,把并行和串行相結(jié)合。

三、并行串行結(jié)合

async function bingChuan(arr, num) {
    let items = arr.splice(0, num);
    
    await Promise.all(items.map(i => i()));
    if (arr.length > 0) {
        await bingChuan(arr, num);
    }
}
bingChuan(arr, 2);
// 2結(jié)束
// 1結(jié)束
// 3結(jié)束

好了,現(xiàn)在可以同時享有并行和串行的好處了!

到此這篇關(guān)于JS異步任務(wù)的并行、串行,以及二者結(jié)合的文章就介紹到這了,更多相關(guān)js異步任務(wù)并行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript 中傳遞參數(shù)的方式

    JavaScript 中傳遞參數(shù)的方式

    在 JavaScript 中,參數(shù)傳遞的方式可以分為基本類型的傳值和復(fù)雜類型的引用傳遞,根據(jù)使用場景和需求,不同的參數(shù)傳遞方式可能會有所差異,本文介紹JavaScript 中傳遞參數(shù)的方式,感興趣的朋友一起看看吧
    2025-01-01
  • mpvue微信小程序多列選擇器用法之省份城市選擇的實現(xiàn)

    mpvue微信小程序多列選擇器用法之省份城市選擇的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于mpvue微信小程序多列選擇器用法之省份城市選擇實現(xiàn)的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • JavaScript隨機生成信用卡卡號的方法

    JavaScript隨機生成信用卡卡號的方法

    這篇文章主要介紹了JavaScript隨機生成信用卡卡號的方法,涉及javascript操作隨機隨機數(shù)生成信用卡卡號的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • JavaScript?事件流:從"捕獲"到"冒泡"的完整旅程

    JavaScript?事件流:從"捕獲"到"冒泡"的完整旅程

    這篇文章給大家介紹JavaScript事件流:從“捕獲”到“冒泡”的完整旅程,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-05-05
  • JavaScript返回當(dāng)前會話cookie全部鍵值對照的方法

    JavaScript返回當(dāng)前會話cookie全部鍵值對照的方法

    這篇文章主要介紹了JavaScript返回當(dāng)前會話cookie全部鍵值對照的方法,涉及javascript操作cookie的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • JS數(shù)字千分位格式化實現(xiàn)方法總結(jié)

    JS數(shù)字千分位格式化實現(xiàn)方法總結(jié)

    這篇文章主要介紹了JS數(shù)字千分位格式化實現(xiàn)方法,結(jié)合實例形式總結(jié)分析了JS實現(xiàn)數(shù)字千分位格式化的常用技巧,包括字符串的分割、拼接、遍歷及正則操作等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-12-12
  • JavaScript實現(xiàn)橫版菜單欄

    JavaScript實現(xiàn)橫版菜單欄

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)橫版菜單欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • javascript實現(xiàn)驗證IP地址等相關(guān)信息代碼

    javascript實現(xiàn)驗證IP地址等相關(guān)信息代碼

    本文給大家分享的是一組判斷IP地址是否合法,判斷子網(wǎng)掩碼是否合法,驗證輸入的網(wǎng)關(guān)地址是否合法的javascript代碼,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-05-05
  • js實現(xiàn)隨機數(shù)字字母驗證碼

    js實現(xiàn)隨機數(shù)字字母驗證碼

    這篇文章主要為大家詳細(xì)介紹了js隨機驗證碼的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JavaScript實現(xiàn)橫線提示輸入驗證碼隨輸入驗證碼輸入消失的方法

    JavaScript實現(xiàn)橫線提示輸入驗證碼隨輸入驗證碼輸入消失的方法

    這篇文章主要介紹了JavaScript實現(xiàn)橫線提示輸入驗證碼隨輸入驗證碼輸入消失的方法,非常實用,在微信開發(fā)中經(jīng)常會用到,需要的朋友可以參考下
    2016-09-09

最新評論

凤阳县| 荥经县| 名山县| 济源市| 巴楚县| 湟源县| 东城区| 旬阳县| 唐山市| 新营市| 抚顺市| 太原市| 宁河县| 泾源县| 崇州市| 桂阳县| 永嘉县| 海淀区| 湖南省| 鞍山市| 西昌市| 襄汾县| 澄江县| 明溪县| 锡林浩特市| 定南县| 呼图壁县| 兴文县| 连云港市| 永顺县| 土默特右旗| 阿巴嘎旗| 改则县| 淮南市| 玛纳斯县| 化州市| 张家口市| 岑巩县| 涿鹿县| 乐业县| 江城|