节点asynchronous推送循环

我有一个asynchronous函数,我想执行我在一个范围内。 我试过这个:

var async = require('async'); function main(a, b){ var funcs = []; for(var i=a; i<=b; i++){ var txt = "func "+i; funcs.push(function(callback){ console.log(i); console.log(txt); callback(null, null); }); } async.parallelLimit(funcs, 10, function(){ console.log("done"); }); } main(1,5); 

输出是:

 6 func 5 6 func 5 6 func 5 6 func 5 6 func 5 done 

为什么我没有“function6”? 顺便说一句我想要1 2 3 4 5 …

谢谢

循环完成后,你的函数将被执行。 所以在循环之后, i将等于6 ,而txt将是相等的func 5 。 把你的循环的内容放入closures来修复它:

 for(var i=a; i<=b; i++){ (function(i) { var txt = "func "+i; funcs.push(function(callback){ console.log(i); console.log(txt); callback(null, null); }); })(i); } 

PS在ECMAScript 6 (即将到来的JavaScript规范)中,有letvariables来解决这个问题。

这是关于closures问题:

尝试这个 :

 function main(a, b){ var funcs = []; for(var i=a; i<=b; i++){ funcs.push((function(c ){ var txt = "func "+c; return function () { console.log(c); console.log(txt); } })(i)); } for (var k=0;k<funcs.length;k++) { funcs[k](); } } main(1,5); 

小提琴

想要提供我的版本的解决scheme

 var printText = function( txt ) { return function( callback ) { print( "text " + txt ); callback( null, null ); }; } ); var funcs = []; for( var i = 0; i < 5; i++ ) { funcs.push( printText( i ) ); } async.parallelLimit( funcs, 10, function() { console.log("done"); } );