gpt4 book ai didi

javascript - 嵌套的异步循环推送到不调用主回调的异步队列

转载 作者:搜寻专家 更新时间:2023-10-31 22:52:40 26 4
gpt4 key购买 nike

我有一个我正在推送的异步队列,它会做一些事情。我生成需要插入的项目的方法是通过几个嵌套列表形成一个数据对象。队列最终处理了所有内容,但由于某种原因,我无法使用 console.log('All done.') 进入我的主回调。我删除了大部分不必要的东西,只留下异步的东西。我究竟做错了什么?我错过了什么吗?

var q = async.queue(function(task, callback) {
console.log('hello ' + task);
callback();
}, 2);

function A(data) {
B(data, function() {
// THIS ISN'T getting called.
console.log('All done.');
})
}

function B(data, callback1) {
var list = [[1,2], [3,4], [5,6]];
async.each(list, function(item, callback1) {
async.each(item, function(i, callback2) {
doWork(i, function() {
console.log('Work done');
})
callback2();
},
// THIS should be called when everything in this each is done.
callback1)
})
}

function doWork(i, callback3) {
q.push(i, callback3);
}

最佳答案

这是带有一些注释的代码,因为谈论回调的回调有点复杂:

function B(data, callback1 //this is what you want to be called) {
var list = [[1,2], [3,4], [5,6]];

//async1
async.each(list, function(item, callback1 //now callback1 is a function passed to your code by `async.each` not the original callback1) {
//async2
async.each(item, function(i, callback2) {
doWork(i, function() {
console.log('Work done');
})
callback2();
},
// THIS is actually called, it's just a different function than you think it is
callback1)
})
}

问题是您对 B 的参数和 async1 回调函数的回调参数使用了相同的名称。

所以 async1 回调中的 callback1 隐藏了外部 callback1 并且实际上是内部 async1 回调,用于将控制权传递回 async.each.

解决方法很简单:重命名async1的回调参数,例如:

function B(data, callback1) {
var list = [[1,2], [3,4], [5,6]];
async.each(list, function(item, async1_callback) { //here lies the rename
async.each(item, function(i, callback2) {
doWork(i, function() {
console.log('Work done');
})
callback2();
},
// this is now called as expected
callback1
);
// BUT we forgot to call the async1_callback, so let's do it:
async1_callback();

};

按预期工作。

关于javascript - 嵌套的异步循环推送到不调用主回调的异步队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975530/

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