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
中的回调需要很长时间才能执行,那么您有几个选项。
- 使用async库
- 使用
process.nextTick
推迟您的每一次迭代的执行for循环
第一个选择肯定是更容易。
第二个选项涉及将您的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