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

时间:2012-07-23 18:48:29

标签: node.js asynchronous

尝试围绕一些基本的异步编程概念。

现在我基本上有两个功能,现在让我们称之为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循环异步处理的预期方式。但是,我似乎无法想出一个解决方案,它不会阻止循环并导致所有内容都被处理,而不是维持并行处理。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

第一种选择肯定更容易。

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

本文对于了解如何使用process.nextTick来完成此任务非常有用:Understanding process.nextTick()

答案 1 :(得分:2)

使用async库,就像这样简单:

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