2013-06-12 69 views
0

我知道我要發佈這個,然後得到它的工作,更不用說標題,但...使用async.js在循環中執行異步操作

我處於我需要的情況對我給出的數組中的每個元素執行一些異步代碼,然後在所有元素完成後進行一些檢查。通常情況下,如果我在這裏使用async.js,但是我所做的事情並沒有得到我想要的結果。

所以這是我的邏輯,我想我可以創建一個函數數組,但我做的方式,這似乎有async.js返回我的功能表中的結果。

findLeadThatCanBeTaken : (leads, user, manualTake, cb) => 
    if(leads.length == 0) then return cb(null, null) 

    funcArr = [] 
    self = this 

    for lead in leads 
    fun = (callback) -> 
     console.log(lead.state) 
     State.get lead.state, (e, state) -> 
     if !state or state.canBeCalled(self.currentTime()) 
      return callback(null, lead._id.toString) 

     return callback(null, null) 

    funcArr.push(fun) 

    async.parallel funcArr, (e, r) -> 
    if (e) 
     return cb(message:'No leads can be called at the current time', null) 

    id = _.compact(r) 
    id = r[0] if r.length 

    if (!id || !id.length) 
     return cb(message:'No leads can be called at the current time', null) 

    lead = _.filter leads, (l) -> return l._id.toString() == id 

    # Code handling 
    @takeLead(lead, user, cb) 

我90%肯定的問題是這陣我創造不被分配了類似的我想是的,但我不知道。任何人都知道我在這裏做錯了什麼?

回答

2

我猜你有一個經典的「一環內關閉」的問題:

for lead in leads 
    fun = (callback) -> 
    # some stuff that uses 'lead'... 

的問題是,所有的fun功能將有完全相同的lead的引用,當這些功能的,lead將引用它在循環中的最後一個值。

fine manual(該部分的底部):

當使用JavaScript的循環產生的功能,這是常見的,以便插入一個封閉的包裝,以保證循環變量被關閉了,所有的生成的函數不只是分享最終值。 CoffeeScript提供了do關鍵字,該關鍵字立即調用傳遞的函數,轉發任何參數。

聽起來很熟悉嗎?你可能想要得到的lead在每次迭代的價值,而不僅僅是拖動周圍lead本身是這樣的:

for lead in leads 
    do (lead) -> 
    fun = (callback) -> 
     # What you have now... 
+0

對不起,這麼長時間,我用打'做()'但那一點都不不工作。結束了,這是我向該陣列推進功能的方式,當時我正在使用與上述不同的東西。結束這是問題! –