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

JavaScript實現(xiàn)異步任務(wù)循環(huán)順序執(zhí)行詳解

 更新時間:2023年03月17日 09:08:50   作者:飛仔FeiZai  
這篇文章主要為大家詳細介紹了JavaScript中實現(xiàn)異步任務(wù)循環(huán)順序執(zhí)行的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

需求場景:數(shù)組的元素作為異步任務(wù)的參數(shù),循環(huán)遍歷該數(shù)組,并執(zhí)行異步任務(wù)。

一、錯誤的實現(xiàn)

簡單的錯誤實現(xiàn)

// 異步任務(wù)的參數(shù)數(shù)組
const arr = [1, 2, 3, 4];
// 異步任務(wù)函數(shù)
function task(params, callback) {
  setTimeout(() => {
    if (!!callback) {
      callback(params);
    }
  }, 1000);
}
// 循環(huán)遍歷異步任務(wù)的參數(shù)數(shù)組,并執(zhí)行異步任務(wù)
console.time("Test code");
arr.forEach((item, index) => {
  task(item, (ret) => {
    console.log("ret", ret);
    console.timeEnd("Test code");

    if (index + 1 < arr.length) {
      console.time("Test code");
    }
  });
});

執(zhí)行結(jié)果輸出:

由上圖可知,所有異步任務(wù)的執(zhí)行是同時開始,并同時結(jié)束的,并未按順序先后執(zhí)行。

使用 Promise.all 的錯誤實現(xiàn)

Promise.all() 是一個用于并行執(zhí)行多個 Promise 的方法,當(dāng)所有的 Promise 都成功執(zhí)行后,它返回一個包含所有 Promise 結(jié)果的數(shù)組,如果其中任何一個 Promise 失敗或出錯,它將直接跳轉(zhuǎn)到 catch 塊中返回一個 rejected 狀態(tài)的 Promise。

// 異步任務(wù)的參數(shù)數(shù)組
const arr = [1, 2, 3, 4];
// 異步任務(wù)函數(shù)
function task(params, callback) {
  setTimeout(() => {
    if (!!callback) {
      callback(params);
    }
  }, 1000);
}

const tasks = [];

// 循環(huán)遍歷異步任務(wù)的參數(shù)數(shù)組,并執(zhí)行異步任務(wù)
console.time("Test code");
arr.forEach((item, index) => {
  tasks.push(
    new Promise((resolve) => {
      task(item, (ret) => {
        console.log("ret", ret);
        console.timeEnd("Test code");

        if (index + 1 < arr.length) {
          console.time("Test code");
        }
        resolve(ret);
      });
    })
  );
});

Promise.all(tasks)
  .then((values) => {
    console.log(values);
  })
  .catch((error) => {
    console.error(error);
  });

執(zhí)行結(jié)果輸出:

由上圖可知,循環(huán)中的所有異步任務(wù)的執(zhí)行是并行執(zhí)行的,并未按順序先后執(zhí)行。因為 Promise.all() 方法的執(zhí)行順序是并行執(zhí)行的,而不是按照 Promise 在數(shù)組中的順序執(zhí)行的。

二、正確的實現(xiàn)

// 異步任務(wù)的參數(shù)數(shù)組
const arr = [1, 2, 3, 4];
// 異步任務(wù)函數(shù)
function task(params, callback) {
  setTimeout(() => {
    if (!!callback) {
      callback(params);
    }
  }, 1000);
}

const tasks = [];

console.time("Test code");
arr.forEach((item, index) => {
  tasks.push(function () {
    return new Promise((resolve) => {
      task(item, (ret) => {
        console.log("ret", ret);
        console.timeEnd("Test code");
        if (index + 1 < arr.length) {
          console.time("Test code");
        }
        resolve(ret);
      });
    });
  });
});

// 定義一個遞歸函數(shù)來依次執(zhí)行任務(wù)
function runTasks(index) {
  if (index >= tasks.length) {
    // 如果所有任務(wù)都已經(jīng)執(zhí)行完畢,返回一個 resolved 的 Promise
    return Promise.resolve();
  }

  // 執(zhí)行當(dāng)前任務(wù),然后遞歸執(zhí)行下一個任務(wù)
  return tasks[index]().then(function () {
    return runTasks(index + 1);
  });
}

// 調(diào)用遞歸函數(shù)來執(zhí)行任務(wù)
runTasks(0)
  .then(function () {
    console.log("All tasks are done!");
  })
  .catch(function (error) {
    console.error(error);
  });

執(zhí)行結(jié)果輸出:

到此這篇關(guān)于JavaScript實現(xiàn)異步任務(wù)循環(huán)順序執(zhí)行詳解的文章就介紹到這了,更多相關(guān)JavaScript異步任務(wù)循環(huán)順序執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript查詢DBpedia小應(yīng)用實例學(xué)習(xí)

    Javascript查詢DBpedia小應(yīng)用實例學(xué)習(xí)

    本文則嘗試?yán)肧PARQLWrapper.js來讀取DBpedia的數(shù)據(jù),并顯示出來,感興趣的你可以參考下,或許對你有所幫助
    2013-03-03
  • JS+Canvas實現(xiàn)五子棋游戲

    JS+Canvas實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了原生JS+Canvas實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JS獲取當(dāng)前網(wǎng)址、主機地址項目根路徑

    JS獲取當(dāng)前網(wǎng)址、主機地址項目根路徑

    本文為大家提供JS如何獲取當(dāng)前網(wǎng)址、主機地址之后的目錄及項目根路徑的方法,喜歡的朋友可以收藏下
    2013-11-11
  • 極易被忽視的javascript面試題七問七答

    極易被忽視的javascript面試題七問七答

    這篇文章主要為大家詳細介紹了一道極易被忽視的javascript面試題七問七答,感興趣的小伙伴們可以參考一下
    2016-02-02
  • javascript實現(xiàn)導(dǎo)航欄分頁效果

    javascript實現(xiàn)導(dǎo)航欄分頁效果

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)導(dǎo)航欄分頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Bootstrap table使用方法匯總

    Bootstrap table使用方法匯總

    這篇文章主要為大家總結(jié)了Bootstrap table簡單使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • JavaScript數(shù)組類型Array相關(guān)的屬性與方法詳解

    JavaScript數(shù)組類型Array相關(guān)的屬性與方法詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組類型Array相關(guān)的屬性與方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • D3.js進階系列之CSV表格文件的讀取詳解

    D3.js進階系列之CSV表格文件的讀取詳解

    D3.js支持從外部讀取數(shù)據(jù)進行圖形交互(Loading External Resources),支持的格式有CSV、txt、Html、tsv、xml文本文件和JSON XML數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了D3.js中CSV表格文件讀取的相關(guān)資料,需要的朋友可以參考下。
    2017-06-06
  • 純js實現(xiàn)圖片勻速淡入淡出效果

    純js實現(xiàn)圖片勻速淡入淡出效果

    這篇文章主要為大家詳細介紹了純js實現(xiàn)圖片勻速淡入淡出效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ionic2中使用自動生成器的方法

    ionic2中使用自動生成器的方法

    這篇文章主要介紹了ionic2中使用自動生成器的方法,需要的朋友可以參考下
    2018-03-03

最新評論

客服| 庆云县| 宁远县| 沾化县| 宝清县| 阜城县| 卓尼县| 玉龙| 蓬溪县| 金沙县| 江安县| 镇平县| 蕉岭县| 准格尔旗| 兰考县| 巢湖市| 晋江市| 文水县| 漳浦县| 德令哈市| 天峻县| 大田县| 景宁| 澎湖县| 南汇区| 岗巴县| 长岛县| 江口县| 灵山县| 昌图县| 石楼县| 永嘉县| 大悟县| 韶山市| 包头市| 花莲县| 呼伦贝尔市| 唐海县| 手游| 泗阳县| 肇东市|