Node.JS/async for循环,嵌套回调中的当前迭代

问题描述:

试图围绕一些基本的异步编程概念进行包装。Node.JS/async for循环,嵌套回调中的当前迭代

现在我基本上有两个函数,现在让我们称它们为getOne和getAll。 getAll基本上是一系列的循环,并调用getOne,然后将其映射到一个散列并将其发送回链中。这基本上是我有什么,在CoffeeScript中:

getOne = (key, callback) -> 
    try 
     # find object referenced by key 
     object = "blah blah" 
     callback(null, object) 
    catch(error) 
     callback(error, null) 

getAll = (keys, callback) -> 
    results = {} 
    try 
     count = keys.length 
     for i, key of keys 
      count-- 
      getOne key, (err, result) -> 
       if(err) 
        # do something 
       else 
        results[key] = result 
       if count is 0 
        callback "", results 
    catch 
     callback error, results 

上面的代码基本上是输出哈希,其中键不一定阵容与预期数据,预计for循环的方式异步处理。但是,我似乎无法想出一个解决方案,它不会阻止循环,并且会导致所有内容在一系列中处理,而不是保持并行处理。

我错过了什么?

没有任何内容与您编写的代码有固有的异步。如果您担心getOne中的回调需要很长时间才能执行,那么您有几个选项。

第一个选择肯定是更容易。

第二个选项涉及将您的getAll函数重写为递归函数(而不是使用for)并在process.nextTick中包装递归子调用。

这篇文章是理解如何使用process.nextTick做到这一点相当有用:Understanding process.nextTick()

使用async库,它是像这样简单:

getAll = (keys, callback) -> 
    funcs = {} 
    keys.forEach (key) => funcs[key] = (_callback) => 
    getOne key, _callback 
    async.parallel funcs, callback