Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript coffeescript中的异步映射_Javascript_Design Patterns_Node.js_Coffeescript - Fatal编程技术网

Javascript coffeescript中的异步映射

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

有没有一种优雅的方法可以异步映射coffeescript中的对象或数组?或者javascript

假设我在一个对象中有一些东西:

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的一个棘手的部分。