2013-06-12 2 views
0

Я знаю, что я собираюсь отправить это, а затем заставить его работать, не говоря уже название, но ...Использование async.js Выполнение асинхронных действия В Loop

Я нахожусь в ситуации, когда мне нужно для выполнения некоторого асинхронного кода каждому элементу в массиве, который мне предоставлен, а затем выполните некоторые проверки после того, как все они закончили. Обычно, если я буду использовать 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

Извините за столь долго, я играл с использованием 'делать()', но это WASN» т работы. В конце концов, именно так я подталкивал функцию к этому массиву, в то время я использовал что-то другое, чем выше. В конце концов, это была проблема! –

Смежные вопросы