亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在完成所有異步回調之后,每個回調都完成了

在完成所有異步回調之后,每個回調都完成了

湖上湖 2019-07-12 16:56:44
在完成所有異步回調之后,每個回調都完成了顧名思義。我該怎么做?我想打電話whenAllDone()在執行forEach-循環之后,對每個元素進行了遍歷,并進行了一些異步處理。[1, 2, 3].forEach(   function(item, index, array, done) {      asyncFunction(item, function itemDone() {        console.log(item + " done");        done();      });   }, function allDone() {      console.log("All done");      whenAllDone();   });能讓它像這樣工作嗎?當用于Each的第二個參數是回調函數時,它會在所有迭代過程中運行嗎?預期產出:3 done1 done2 doneAll done!
查看完整描述

3 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

如果遇到異步函數,并且希望在執行代碼之前確保它完成任務,那么我們始終可以使用回調功能。

例如:

var ctr = 0;posts.forEach(function(element, index, array){
    asynchronous(function(data){
         ctr++; 
         if (ctr === array.length) {
             functionAfterForEach();
         }
    })});

注:functionAfterForEach是在Foreach任務完成后要執行的函數。asynchronous在foreach中執行的異步函數。


查看完整回答
反對 回復 2019-07-12
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

奇怪的是,給出了多少錯誤的答案異步凱斯!可以簡單地顯示,檢查索引沒有提供預期的行為:

// INCORRECTvar list = [4000, 2000];list.forEach(function(l, index) {
    console.log(l + ' started ...');
    setTimeout(function() {
        console.log(index + ': ' + l);
    }, l);});

產出:

4000 started2000 started1: 20000: 4000

如果我們檢查一下index === array.length - 1,將在完成第一次迭代時調用回調,而第一個元素仍未完成!

要解決這個問題,而不需要使用外部庫(例如異步),我認為最好的方法是在每次迭代之后節省列表長度和減少。因為只有一條線,所以我們確信沒有比賽條件的可能。

var list = [4000, 2000];var counter = list.length;list.forEach(function(l, index) {
    console.log(l + ' started ...');
    setTimeout(function() {
        console.log(index + ': ' + l);
        counter -= 1;
        if ( counter === 0)
            // call your callback here
    }, l);});


查看完整回答
反對 回復 2019-07-12
  • 3 回答
  • 0 關注
  • 632 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號