gpt4 book ai didi

javascript - 多个异步系列导致 Javascript 中的错误行为

转载 作者:行者123 更新时间:2023-11-28 01:33:51 24 4
gpt4 key购买 nike

我正在使用异步库(浏览器版本)。我陷入了这样的境地:async series 的正常(读取“预期”)行为失败了。当我将异步调用嵌套在另一个调用中时。

这里有一些 fiddle 产生错误的输出

fiddle 1

fiddle 2

问题总结如下

代码如下

$(函数(){

async.series([

function f1(cb) {
setTimeout(function () {
console.log("Hello from f1");
cb(null);
}, 3000);

async.series([

function f11(cb) {
setTimeout(function () {
console.log("Hello from f11");
cb(null);
}, 3000);
}, function f12(cb) {
setTimeout(function () {
console.log("Hello from f12");
cb(null);
}, 3000);
}, function f13(cb) {
setTimeout(function () {
console.log("Hello from f13");
cb(null);
}, 3000);
}], function (err, res) {
console.log("Done all in f1");
});

}, function f2(cb) {
setTimeout(function () {
console.log("Hello from f2");
cb(null);
}, 3000);
}],

function (err, res) {
console.log("Done all");
});

});

我期望的输出如下

Hello from f1 
Hello from f11
Hello from f12
Hello from f13
Done all in f1
Hello from f2
Done all

但我明白了 -

Hello from f1
Hello from f11
Hello from f2
Done all
Hello from f12
Hello from f13
Done all in f1

你看到的问题和我看到的一样吗?我认为 async.series 会因为同时运行多个异步系列而感到困惑。如果是这种情况,如何将嵌套的管道输送到主管道中。有人帮忙@Caolan

答案根据 @tom 的编辑。在代码的早期调用 cb(null) 是一个错误 - 更正了下面的代码

$(function () {

async.series([

function f1(cb) {
setTimeout(function () {
console.log("Hello from f1");
}, 3000);

async.series([

function f11(cb1) {
setTimeout(function () {
console.log("Hello from f11");
cb1(null);
}, 3000);
}, function f12(cb1) {
setTimeout(function () {
console.log("Hello from f12");
cb1(null);
}, 3000);
}, function f13(cb1) {
setTimeout(function () {
console.log("Hello from f13");
cb1(null);
}, 3000);
}], function (err, res) {
console.log("Done all in f1");
cb(null);
});

}, function f2(cb) {
setTimeout(function () {
console.log("Hello from f2");
cb(null);
}, 3000);
}],

function (err, res) {
console.log("Done all");
});

});

最佳答案

对于异步函数,调用回调类似于从普通函数返回,因为它会恢复程序其余部分的执行。在函数 f1 中,调用 cb 会导致执行 f2(最终打印 Hello from f2全部完成)。

为了确保 f2f11f12f13 全部完成后执行,调用cb 应移至内部 async.series() 调用的最终回调,位于 console.log("Done all in f1")< 行之后.

关于javascript - 多个异步系列导致 Javascript 中的错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21775894/

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