节点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规范)中,有let
variables来解决这个问题。
这是关于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"); } );