Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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 使用async.js在循环中执行异步操作_Javascript_Asynchronous_Coffeescript_Async.js - Fatal编程技术网

Javascript 使用async.js在循环中执行异步操作

Javascript 使用async.js在循环中执行异步操作,javascript,asynchronous,coffeescript,async.js,Javascript,Asynchronous,Coffeescript,Async.js,我知道我会发布这个,然后让它工作,更不用说标题了,但是 我需要对给定数组中的每个元素执行一些异步代码,然后在所有元素完成后执行一些检查。通常情况下,如果我在这里使用async.js,但是我的方法并没有得到我想要的结果 这就是我的逻辑,我想我可以创建一个函数数组,但是我这样做的方式似乎让async.js在结果中返回一个函数列表 findLeadThatCanBeTaken : (leads, user, manualTake, cb) => if(leads.length == 0) t

我知道我会发布这个,然后让它工作,更不用说标题了,但是

我需要对给定数组中的每个元素执行一些异步代码,然后在所有元素完成后执行一些检查。通常情况下,如果我在这里使用async.js,但是我的方法并没有得到我想要的结果

这就是我的逻辑,我想我可以创建一个函数数组,但是我这样做的方式似乎让async.js在结果中返回一个函数列表

findLeadThatCanBeTaken : (leads, user, manualTake, cb) =>
  if(leads.length == 0) then return cb(null, null)

  funcArr = []
  self = this

  for lead in leads
    fun = (callback) ->
      console.log(lead.state)
      State.get lead.state, (e, state) ->
        if !state or state.canBeCalled(self.currentTime())
          return callback(null, lead._id.toString)

        return callback(null, null)

    funcArr.push(fun)

  async.parallel funcArr, (e, r) ->
    if (e)
      return cb(message:'No leads can be called at the current time', null)

    id = _.compact(r)
    id = r[0] if r.length

    if (!id || !id.length)
      return cb(message:'No leads can be called at the current time', null)

    lead = _.filter leads, (l) -> return l._id.toString() == id

    # Code handling 
    @takeLead(lead, user, cb)

我90%确定问题在于我创建的数组没有像我认为的那样被分配,但我不确定。有人知道我做错了什么吗?

我猜你有一个经典的“循环内闭包”问题:

问题是所有
fun
函数都会引用完全相同的
lead
,当这些函数执行时,
lead
会引用它在循环中的最后一个值

从(该部分底部)开始:

当使用JavaScript循环生成函数时,通常会插入一个闭包包装器,以确保循环变量被关闭,并且所有生成的函数不只是共享最终值。CoffeeScript提供
do
关键字,该关键字立即调用传递的函数,转发任何参数

听起来熟悉吗?您可能希望在每次迭代中获得
lead
的值,而不是仅通过如下方式拖动
lead
本身:

for lead in leads
  do (lead) ->
    fun = (callback) ->
      # What you have now...

很抱歉花了这么长时间,我在玩
do()
,但它不起作用。最后,我是如何将函数推送到那个数组的,当时我使用的是与上面不同的东西。结果这就是问题所在!
for lead in leads
  do (lead) ->
    fun = (callback) ->
      # What you have now...