2013-04-08 2 views
0

Я думаю, что в моем понимании есть принципиальное разъединение. Я читал обратные вызовы, и я искал, почему следующее может не работать, но я могу искать не то место. У меня есть следующий код:переменные async.series и javascript

users = [] 
    async.series [ 
    () -> 
     userClient.smembers "users", (err, list) -> 
     async.each list, (item, cb) -> 
      userClient.hgetall item, (err, user) -> 
      users.push user 
     , (err) -> 
      console.log err    
    , 
    () -> 
     console.log "test" 
     console.log users 
    ] 

console.log «тест», похоже, не будет печатать, и я пробовал много различных итераций кода, но как только он попадает за пределы внутреннего most loop (user.push user), я не могу получить значение для пользователей. Я получаю пустой массив []. У кого-нибудь есть понимание или, возможно, можно указать, где я ошибался в своих мыслях? Спасибо.

ответ

2

Поскольку каждая функция асинхронна, она не может автоматически знать, когда перейти к следующему этапу серии. Каждая функция серии выполняет обратный вызов в качестве аргумента, который необходимо вызвать.

(doneCallback) -> 
    userClient.smembers "users", (err, list) -> 
    async.each list, (item, cb) -> 
     userClient.hgetall item, (err, user) -> 
     users.push user 

     // You also need to call 'cb' here. 
     cb(); 
    , (err) -> 
     console.log err 

     // Add this to go to the next step after. 
     doneCallback(err) 

Также depepending на то, что вы используете users для, вы можете использовать async.map вместо async.each для упрощения кода.

+0

Благодарим вас за разъяснение! Все еще обволакивая асинхронный материал, но это помогло! – serverglitch

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