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は equal になり、 equal6になり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);
}

PS ECMAScript 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 に答える