【问题标题】:async.eachSeries not working as expectedasync.eachSeries 未按预期工作
【发布时间】:2015-11-24 01:11:10
【问题描述】:

我很难使用 async.eachSeries。我已经创建了一个代码和平来说明。

const arr = [1, 2, 3, 4, 5, 6, 7];
function doJob(callback){
    debugger; //#1
    async.eachSeries(arr, function(task, cb){
        console.log('Starting checking function');
        debugger; //#2
        if(task%2 === 0){
            debugger; //#3
            console.log('Task even: ' + task);

            r.exists("somekty", function(err ,result){
                if(err || result){
                    debugger; //#4
                    cb(null);
                }else{
                    debugger; //#5
                    cb(null);
                }
            });
        }else{
            debugger;//#6
            console.log('Task odd: ' + task);
                cb(null);
        }
        debugger;//#7
    }, function(err){
        callback()
    });
}

setTimeout(function(){
    doJob(function(){
        console.log('All done!');
    })
}, 1000)

当我执行上面的代码时,预期的结果应该是(对我来说): 命中:#1

1 次迭代:#2 - #6

2 次迭代:#2 - #3 - #7 - #4||#5

3 次迭代:.... ...

继续前进....但是当它第一次进入具有异步函数(redis)的“if”内部时,它只会进入#7并且永远不会在#4或#5处停止并且完成代码。为什么?

我正在使用 Iron-node 进行调试。

【问题讨论】:

    标签: node.js debugging asynchronous node-inspector


    【解决方案1】:

    但是第一次发生时会发生什么 在具有异步函数(redis)的“if”中,它只是转到#7 并且永远不会停在#4 或#5 并完成代码。为什么?

    这就是异步代码的工作原理。如果r.exists() 是异步的,那么调用它会启动操作,然后您的其余代码会继续执行。异步操作在完成之前不会阻塞。调用它们只是启动操作,然后您的其余代码继续执行。

    所以,当task%2 === 0 时,您将进入代码的那个分支。然后它会调用r.exists(...)。这将启动该异步操作,然后您的代码行将继续运行。

    在您的代码中执行的下一件事是debugger;//#7,以便触发。

    此时async.eachSeries() 将发挥作用,并且在有人调用cb(null) 之前不会执行循环的下一次迭代,这在您的代码中将在r.exists() 完成并调用其回调时发生。

    task%2 === 0时,你应该看到这个序列:

    #2, #3, #7, #4|#5
    

    这显然是你观察到的。


    仅供参考,在使用大量调试器断点时,有时可能会让人难以理解代码的真实时序,因为在断点处停止本身会影响各种操作的时序(它使本机代码异步操作有机会在坐在断点处)。在理解异步操作的纯时序时,通常最好只使用console.log() 语句来输出足够的信息来记录事情的真实顺序。

    【讨论】:

    • 是的,我同意你所说的一切,也理解。问题是我希望它是意甲,但事实并非如此。当脚本第一次进入“r.exists”时,它会进入#7(如预期的那样),应该等到“r.exists”完成,然后激活调试器#4 或#5。但发生的情况是,在它达到 #7 之后,代码神奇地结束,而不会停在 #4 或 #5。
    • 谢谢,我不知道这个异步调试“问题”。
    • @HaroldFinch - async.eachSeries() 本身是异步的。所以调用它,只是启动操作。一旦循环的第一次迭代完成并且该迭代正在等待异步操作,它之后的代码行将立即执行。这是 Javascript 中的异步编程。如果您希望在async.eachSeries() 操作完全完成后执行某些代码,则将该代码放在async.eachSeries() 的最终回调中。这就是回调的用途。
    猜你喜欢
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    • 2015-01-13
    • 2013-08-01
    相关资源
    最近更新 更多