素材牛VIP会员
node.js for循环中async.series的问题
 过***天  分类:Node.js  人气:734  回帖:5  发布于2年前 收藏

尝试使用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
 标签:asyncnode.js

讨论这个帖子(5)垃圾回帖将一律封号处理……

Lv6 码匠
lk***29 CEO 2年前#1

另外也建议你把

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

倒个顺序:

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

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

Lv5 码农
龙***6 UI设计师 2年前#2

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

Lv5 码农
95***06 站长 2年前#3

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

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

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

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

所以就这样了。


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

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

var i = 0

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

recurse()

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

好像偏题了。。。

Lv2 入门
ok***23 产品经理 2年前#4

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

list.forEach(function(ele) {
    (function() {
    })(ele);
})
Lv4 码徒
麦***6 站长 2年前#5

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取