1

我有一个异步函数,我想在一个范围内为 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 ...

谢谢

4

3 回答 3

2

您的函数将在循环完成后执行。所以后循环i将是相等6的,并且txt将是相等func 5的。将循环的内容关闭以修复它:

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(即将推出的 JavaScript 规范)中,有一些let变量可以解决这个问题。

于 2015-01-25T14:09:02.967 回答
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");
} );
于 2015-01-25T23:23:55.680 回答
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);

小提琴

于 2015-01-25T14:11:29.543 回答