我想在一个范围内为i执行异步功能。我试过这个:
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
为什么我没有“func 6”???顺便说一下,我想1 2 3 4 5 ...
由于
答案 0 :(得分:2)
循环完成后,您的功能将被执行。因此,循环i
将等于6
,txt
将等于func 5
。将循环内容放入closure以修复它:
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可解决此问题。
答案 1 :(得分:0)
关于关闭问题:
试试这个:
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);
答案 2 :(得分:0)
想要提供我的解决方案版本
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");
} );