node.js for循环中async.series的问题

发布于 2022-08-27 11:40:07 字数 1449 浏览 12 评论 0

尝试使用https://github.com/caolan/async#series来实现一些串行操作,不过出现了一个问题,请看代码:

async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
            console.log("one");
        }, 2000);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
            console.log("two");
        }, 1000);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});

以上代码输出

one
two

这没有问题。

但是在for循环中调用async.series

for (var i = 0; i < 3; i++) {
    async.series({
        one: function(callback){
            setTimeout(function(){
                callback(null, 1);
                console.log("one");
            }, 2000);
        },
        two: function(callback){
            setTimeout(function(){
                callback(null, 2);
                console.log("two");
            }, 1000);
        }
    },
    function(err, results) {
        // results is now equal to: {one: 1, two: 2}
    });
}

个人的预期是输出

one
two
one
two
one
two

但实际结果是:

one
one
one
two
two
two

求解答。

环境

Mac OS X 10.8.5
node@v0.10.15
async@0.2.9

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

陈甜 2022-09-03 11:40:08

另外也建议你把

callback(null, 1);
console.log("one");

倒个顺序:

console.log("one");
callback(null, 1);

因为等callback执行完了再执行console的话,谁知道这之间会多发生一些什么。

原谅我要高飞 2022-09-03 11:40:08

如果函数里需要传参数怎么办?

美男兮 2022-09-03 11:40:08

async.series本来就是串行执行的,执行完一个function才会执行另一个。先执行one,3次执行完毕才会执行two。

稀香 2022-09-03 11:40:08

for里面的回调好像要自己处理

list.forEach(function(ele) {
    (function() {
    })(ele);
})
梦年海沫深 2022-09-03 11:40:07

虽然说如果熟悉 JavaScript 的异步机制,这是一个很好理解的原理,但我们尽量别看得这么复杂:

async.series 的作用是,先执行 one,完毕再执行 two,这个很好理解。

因此在 for 循环里你做了这么一件事:一口气创建三个「先执行 one,再执行 two」

于是,大家一起先执行 one,然后「不约而同」地执行 two。

所以就这样了。


这或许不是你想要的答案,但如果初次接触 JavaScript 的移步的话,建议还是先花时间理解回调的工作方式,而不是套用 async 这类把细节封装掉的库。

如果想深入理解的话,可以试试最原始的递归:

var i = 0

function recurse () {
  // ...做爱做的事...
  i++
  if (i < 2) {
    recurse()
  }
}

recurse()

或者尝试朴灵大神的 EventProxy 库,「当『什么』发生时干『嘛』」的思路。

好像偏题了。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文