2014-02-14 11 views
1

我正在使用異步庫(瀏覽器版本)。當我將異步調用嵌套到另一個異步調用中時,我被卡在正常狀態(讀取'預期')行爲async series的地步。在Javascript中導致錯誤行爲的多個Async系列

這裏有一些小提琴製作輸出錯誤

fiddle 1

fiddle 2

的問題在這裏

總結隨着代碼如下

$(函數(){

async.series([ 

function f1(cb) { 
    setTimeout(function() { 
     console.log("Hello from f1"); 
     cb(null); 
    }, 3000); 

    async.series([ 

    function f11(cb) { 
     setTimeout(function() { 
      console.log("Hello from f11"); 
      cb(null); 
     }, 3000); 
    }, function f12(cb) { 
     setTimeout(function() { 
      console.log("Hello from f12"); 
      cb(null); 
     }, 3000); 
    }, function f13(cb) { 
     setTimeout(function() { 
      console.log("Hello from f13"); 
      cb(null); 
     }, 3000); 
    }], function (err, res) { 
     console.log("Done all in f1"); 
    }); 

}, function f2(cb) { 
    setTimeout(function() { 
     console.log("Hello from f2"); 
     cb(null); 
    }, 3000); 
}], 

function (err, res) { 
    console.log("Done all"); 
}); 

});

我所期望的輸出如下

Hello from f1 
Hello from f11 
Hello from f12 
Hello from f13 
Done all in f1 
Hello from f2 
Done all 

但我得到這個 -

Hello from f1 
Hello from f11 
Hello from f2 
Done all 
Hello from f12 
Hello from f13 
Done all in f1 

你看,我看這個問題?我認爲async.series會因爲同時運行多個異步系列而感到困惑。如果是這種情況,我怎樣才能將嵌套管道嵌入主管中。任何人都可以幫忙@Colaola

答案來自@tom的編輯。在代碼早期調用cb(null)是錯誤的 -

$(function() { 

async.series([ 

function f1(cb) { 
    setTimeout(function() { 
     console.log("Hello from f1"); 
    }, 3000); 

    async.series([ 

    function f11(cb1) { 
     setTimeout(function() { 
      console.log("Hello from f11"); 
      cb1(null); 
     }, 3000); 
    }, function f12(cb1) { 
     setTimeout(function() { 
      console.log("Hello from f12"); 
      cb1(null); 
     }, 3000); 
    }, function f13(cb1) { 
     setTimeout(function() { 
      console.log("Hello from f13"); 
      cb1(null); 
     }, 3000); 
    }], function (err, res) { 
     console.log("Done all in f1"); 
     cb(null); 
    }); 

}, function f2(cb) { 
    setTimeout(function() { 
     console.log("Hello from f2"); 
     cb(null); 
    }, 3000); 
}], 

function (err, res) { 
    console.log("Done all"); 
}); 

});

回答

1

對於異步函數,調用回調類似於從正常函數返回,這意味着它恢復執行程序的其餘部分。在功能f1中,調用cb會導致f2被執行(最終打印Hello from f2Done all)。

爲了確保後f11f12f13都完成f2執行,調用cb應該被移到內async.series()呼叫的最終回調,行console.log("Done all in f1")後。

+0

是的,這是正確的。爲了簡化問題,我做了一些編輯。這使得這個問題失去了它的肉。 – saurshaz

+0

感謝您的回答。請看小提琴也。我正在編輯問題反映我的意思。 – saurshaz

+0

請參閱編輯的問題。我的問題是在不同的背景下。現在更清楚了。 – saurshaz

0

根據@tom編輯的答案。在代碼早期調用cb(null)是一個錯誤 - 在問題本身中,上面已經編輯了更正後的代碼。

相關問題