【问题标题】:Async.parallel with an array of tasksAsync.parallel 与一系列任务
【发布时间】:2013-01-20 21:03:19
【问题描述】:

我在弄清楚如何创建具有不同参数的函数数组时遇到问题。我正在使用coffeescript 和async,但我认为这是我对javascript 的理解有问题。

我想创建一个具有不同任务的函数数组。

names = ['Jeff', 'Maria', 'Steve']
tasks = []

for name in names
  tasks.push (callback)=>
      @controller.get_person name, (person) =>
        callback(null, person)

async.parallel(tasks, cb)

问题在于,该任务被 Steve(总是数组中最后一个)调用了 3 次。如何使每个名称都有一个任务?

【问题讨论】:

标签: javascript asynchronous coffeescript


【解决方案1】:

实际上,在这种特殊情况下,您可能应该使用异步的map

getPerson = (name, callback) =>
  @controller.get_person name, (person) ->
    callback(null, person)

async.map names, getPerson, (err, persons) ->
  // Do stuff with persons

请注意,如果您的 @controller.get_person 方法遵循将任何错误作为第一个参数传递给回调的节点做法,那么这就足够了:

async.map names, @controller.get_person, (err, persons) ->
  // Do stuff with persons

也许要记住一些事情。

【讨论】:

  • 非常好!谢谢你。第一种方法效果很好。第二种方式看起来很棒。但是,在第二种方式中,@controller 似乎没有传递给map 函数。我的意思是@ 似乎反弹并失去了对controller 的引用。有没有办法解决这个问题?
  • @Scoop: 是的,您需要用粗箭头 (=>) 声明 get_person,这样它就会始终绑定到对象(在 @controller 的类定义中) .
【解决方案2】:

尝试将for name in names 更改为names.forEach (name)=>。注意forEach后面的空格。

names = ['Jeff', 'Maria', 'Steve']
tasks = []

names.forEach (name)=>
  tasks.push (callback)=>
      @controller.get_person name, (person) =>
        callback(null, person)

async.parallel(tasks, cb)

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2016-02-06
    相关资源
    最近更新 更多