2015-09-02 42 views
0

我試圖使用async.js庫來實現以下目標:確保兩個功能,另外,其中第一個函數內的異步調用後執行一個它

  • 我有兩個功能:功能a()和功能b()
  • 我想功能a()執行第一直到完成,然後我想功能b()執行,直到完成
  • 功能a()有它
  • 內到另一個異步函數的調用

到目前爲止,我已經收集到了我應該使用異步庫中的series()函數。這是我到目前爲止有:

async.series([ 
    function(callback) { 
     var someResult = a(); 
     callback(null, someResult); 
    }, 
    function(callback) { 
     var someOtherResult = b(); 
     callback(null, someOtherResult); 
    } 
], 
function(err, results) { 
    console.log('Yay'); 
}); 

這非常類似於async.js文檔中列出的代碼,但裏面a()有一些其他的異步活動正在進行。

我想等到a()裏面的所有活動完成之後再執行b()。這可能嗎?如果我需要修改a()的內容,需要做些什麼?我知道這種問題與應該如何將節點寫入節點(通常是js)有關,但a()內部的異步操作是數據庫查詢。

如果需要,歡迎提供更多信息!

謝謝!

+1

我猜測,在「a」調用的異步函數的回調內部調用「b」不是一種選擇嗎? – lucas

+0

@lucas是的,這是一種可能性,但它使得代碼更少可讀。如果有必要的話,我可以做到。 –

+1

如果'a'是異步的 - 它返回什麼?它有可能會返回一個承諾? – zerkms

回答

1

所有的異步函數都必須接受回調(或返回一個承諾)。否則,在異步函數完成後無法執行某些操作。

因此,由於a()是異步的。我假設你的例子:

var someResult = a(); 

是一個錯字。它應該是:

a(function(someResult){ 
    // ... 
}) 

有沒有辦法解決這個問題。您不能暫停解釋器並等待異步函數完成,因爲暫停解釋器也會暫停事件循環,導致異步函數永遠不會完成。

如果a()編寫正確,你應該能夠只是這樣做:

async.series([ 
    function(callback) { 
     a(function(someResult){ 
      callback(null, someResult); 
     }); 
    }, 
    function(callback) { 
     var someOtherResult = b(); 
     callback(null, someOtherResult); 
    } 
], 
function(err, results) { 
    console.log('Yay'); 
}); 

如果沒有,發a()回誰寫它的人告訴他,他做錯了。

+0

男人,這是一個很棒的解釋!「a()」的作者是我,你不用擔心,我告訴他他做錯了,我很想寫異步代碼,這只是我腦海中的燈泡時刻!非常感謝你的大力幫助!把你的電子郵件地址發給我,我會送你一杯啤酒! –

相關問題