2013-04-08 76 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“测试”似乎并没有被打印,我已经尝试了很多不同的代码重复的,但一旦它得到内外部大多数循环(users.push用户),我无法检索用户的值。我最终得到一个空数组[]。任何人都有洞察力,或者也许可以指出我的想法在哪里出错了?谢谢。

回答

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) 

您使用users什么也depepending,您可能需要使用的async.map代替async.each以简化代码。

+0

谢谢你的解释!仍围绕异步的东西包裹我的头,但这有帮助! – serverglitch 2013-04-08 03:16:43