Javascript coffeescript中的异步映射
有没有一种优雅的方法可以异步映射coffeescript中的对象或数组?或者javascript 假设我在一个对象中有一些东西:Javascript coffeescript中的异步映射,javascript,design-patterns,node.js,coffeescript,Javascript,Design Patterns,Node.js,Coffeescript,有没有一种优雅的方法可以异步映射coffeescript中的对象或数组?或者javascript 假设我在一个对象中有一些东西: things = x: ... y: ... z: ... thingCount = 3 我想创建一个方法来处理这些事情并返回处理过的对象。进程必须进行异步调用以获取关于每件事情的一些信息。 起初,我尝试循环遍历属性,如下所示: processThings = (callback) -> processedThi
things =
x:
...
y:
...
z:
...
thingCount = 3
我想创建一个方法来处理这些事情并返回处理过的对象。进程必须进行异步调用以获取关于每件事情的一些信息。
起初,我尝试循环遍历属性,如下所示:
processThings = (callback) ->
processedThings = {}
count = 0
for key,val in things
asyncJob key,val (err,result) ->
if err
callback error
else
# PROBLEM: key has the incorrect value here
processedThings[key] = result
count += 1
if count == thingCount
callback null,processedThings
问题在于循环中键的值会发生变化。因此,我的解决方案是创建一个子函数,使关键变量包含在其闭包中:
processThings = (callback) ->
processedThings = {}
count = 0
processThing = (key,val) ->
asyncJob key,val (err,result) ->
if err
callback error
else
processedThings[key] = result
count += 1
if count == thingCount
callback null,processedThings
processThing key,val for key,val of things
但是男孩你好,那肯定是令人沮丧的。是否有一个首选模式?CoffeeScript使用do关键字对此进行了说明,如以下内容末尾所述: 当使用JavaScript循环生成函数时,通常会插入一个闭包包装器,以确保循环变量被关闭,并且所有生成的函数不只是共享最终值。CoffeeScript提供do关键字,该关键字立即调用传递的函数,转发任何参数
for filename in list
do (filename) ->
fs.readFile filename, (err, contents) ->
compile filename, contents.toString()
它可以应用于您的代码,如下所示:
processThings = (callback) ->
processedThings = {}
count = 0
for key,val in things
# add this to close over `key`
do (key) ->
asyncJob key,val (err,result) ->
if err
callback error
else
processedThings[key] = result
count += 1
if count == thingCount
callback null,processedThings
使用后,看起来像一个很好的图书馆雷诺斯-谢谢!很漂亮,谢谢你,乔纳森!这是javascript的一个棘手的部分。