node.js for循环中async.series的问题
尝试使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
另外也建议你把
倒个顺序:
因为等callback执行完了再执行console的话,谁知道这之间会多发生一些什么。
如果函数里需要传参数怎么办?
async.series本来就是串行执行的,执行完一个function才会执行另一个。先执行one,3次执行完毕才会执行two。
for里面的回调好像要自己处理
虽然说如果熟悉 JavaScript 的异步机制,这是一个很好理解的原理,但我们尽量别看得这么复杂:
async.series 的作用是,先执行 one,完毕再执行 two,这个很好理解。
因此在 for 循环里你做了这么一件事:一口气创建三个「先执行 one,再执行 two」
于是,大家一起先执行 one,然后「不约而同」地执行 two。
所以就这样了。
这或许不是你想要的答案,但如果初次接触 JavaScript 的移步的话,建议还是先花时间理解回调的工作方式,而不是套用 async 这类把细节封装掉的库。
如果想深入理解的话,可以试试最原始的递归:
或者尝试朴灵大神的 EventProxy 库,「当『什么』发生时干『嘛』」的思路。
好像偏题了。。。