首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致Javascript中错误行为的多异步系列

导致Javascript中错误行为的多异步系列
EN

Stack Overflow用户
提问于 2014-02-14 09:47:35
回答 2查看 72关注 0票数 1

我正在使用异步库(浏览器版本)。当我将异步调用嵌套在另一个异步调用中时,我发现异步系列的正常行为(读取“预期”)出现了故障。

以下是一些产生错误输出的小摆设

小提琴1

小提琴2

这里总结了这个问题。

使用下面的代码

$(函数() {

代码语言:javascript
复制
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");
});

});

我预期输出如下

代码语言:javascript
复制
Hello from f1 
Hello from f11
Hello from f12
Hello from f13
Done all in f1
Hello from f2 
Done all

但我得到了这个-

代码语言:javascript
复制
Hello from f1
Hello from f11
Hello from f2
Done all 
Hello from f12
Hello from f13 
Done all in f1

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

答案由“汤姆”编辑而来。在以下代码更正的代码中早期调用cb(null)是错误的。

代码语言:javascript
复制
$(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");
});

});

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-14 10:16:38

对于异步函数,调用回调类似于从正常函数返回,因为它恢复了程序其余部分的执行。在函数f1中,调用cb将导致执行f2 (最终打印Hello from f2Done all)。

为了确保f2是在f11f12f13都完成后执行的,对cb的调用应该移到行console.log("Done all in f1")之后的内部async.series()调用的最后回调。

票数 1
EN

Stack Overflow用户

发布于 2014-02-14 13:42:38

答案由“汤姆”编辑而来。在代码的早期调用cb(null)是一个错误--更正的代码在问题本身中已经被编辑过了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21775894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档