2

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

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

我错过了什么?

4

2 回答 2

3

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

第一个选择肯定更容易。

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

这篇文章对于理解如何使用process.nextTick来完成这个相当有用:Understanding process.nextTick()

于 2012-07-23T19:05:32.630 回答
2

使用这个async库,就这么简单:

getAll = (keys, callback) ->
  funcs = {}
  keys.forEach (key) => funcs[key] = (_callback) =>
    getOne key, _callback
  async.parallel funcs, callback
于 2012-07-23T19:37:42.800 回答