尝试围绕一些基本的异步编程概念。
现在我基本上有两个功能,现在让我们称之为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循环异步处理的预期方式。但是,我似乎无法想出一个解决方案,它不会阻止循环并导致所有内容都被处理,而不是维持并行处理。
我错过了什么?
答案 0 :(得分:3)
您编写的代码没有任何内在异步。如果您担心getOne
中的回调需要很长时间才能执行,那么您有几个选择。
process.nextTick
来推迟执行for循环的每次迭代第一种选择肯定更容易。
第二个选项涉及将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