2013-01-08 52 views
0

這裏之前等待後中間件保存完成是我的問題,我有一個工人運行收集了一些數據,然後將其保存到一個架構。在這些模式中,我有保存後發生的後中間件功能。問題在於,我的工作人員在循環前不等待後中間件完成工作,並再次保存到同一個模式。隨着我的工作人員繼續運行,它會大幅度減速,因爲它會在完成之前一遍又一遍地排隊這些功能。那些中間件函數也保存到其他模式中,這些模式也執行自己的後期功能。因爲我可以告訴你,開始真正放慢速度,因爲我正在處理成千上萬的被保存的對象。什麼我的代碼一種看起來喜歡獲取函數繼續

例子:

工人

tranFunc = (stuff, Object) -> 
      newObject = Object 
      newObject = new Object newObject 
      newObject.save (err) -> 

另存現在跳入其中一些事情發生的模式,而是一個完成並保持在我的工人環要

架構

ObjectSchema.post("save", function() { 
DOING STUFF 

我已閱讀,我庫侖d可能會使用類似於next()的東西作爲對工作人員的回調,但是我嘗試使用它並不成功。

+2

能喲utry發佈「最小可運行」的例子嗎?我想你需要做的是確保你的所有異步代碼被接受的回報回調像它應該,但我不知道里面是什麼東西在你的例子,所以我不能告訴你需要添加加時賽的回調。 – hugomg

+0

那麼這就是問題,我不知道如何撥打電話回去,這樣工人知道我的架構後...我的架構不是嵌套wihin工人單獨放置..its櫃面這是你在想什麼... –

+0

無論如何,我試圖給出答案,看看它是否合理。 – hugomg

回答

1

我不認爲我可以在其目前的形式回答這個問題,但其基本思想是,

  1. 異步函數應該使用回調溝通時,他們這樣做
  2. 函數調用異步代碼是自己是異步的。

所以在你的情況下,它看起來像工作者函數違反了這個原則,因爲它調用異步函數而不是異步本身。你會加入一回回調作爲參數,並呼籲解決這個問題所說的一切後callbabk完成(即回調你撥打的最後異步方法內)

//sort of like this: 
tranFunc = (stuff, Object, doneCb) -> 
     newObject = Object 
     newObject = new Object newObject 
     newObject.save (err) -> 
      doneCb(/*put return values here as appropriate*/) 

現在不管是誰打電話tranFunc就能知道內部保存方法何時完成。