节点异步推送循环

node Async push loop

我有一个异步函数,我想在一个范围内为我执行。我试过了:

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 ...

谢谢

你的函数将在循环完成后执行。所以循环后 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);
}

PSECMAScript 6 (upcoming specification of JavaScript) there are let variables中解决了这个问题。

关于闭包问题:

试试这个:

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);

Fiddle

想提供我的解决方案

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");
} );