gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:38:24 25 4
gpt4 key购买 nike

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

我所处的情况是,我需要对给定的数组中的每个元素执行一些异步代码,然后在所有元素完成后进行一些检查。通常,如果我在这里使用 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% 确定问题是我正在创建的这个数组没有像我想象的那样被分配,但我不确定。有人知道我在这里做错了什么吗?

最佳答案

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

for lead in leads
fun = (callback) ->
# some stuff that uses 'lead'...

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

来自fine manual (该部分的底部):

When using a JavaScript loop to generate functions, it's common to insert a closure wrapper in order to ensure that loop variables are closed over, and all the generated functions don't just share the final values. CoffeeScript provides the do keyword, which immediately invokes a passed function, forwarding any arguments.

听起来很熟悉吗?您可能希望在每次迭代中获取 lead 的值,而不是像这样拖动 lead 本身:

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

关于javascript - 使用 async.js 在循环中执行异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com