节点异步推送循环

时间:2015-01-25 13:38:46

标签: node.js node-async

我想在一个范围内为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 ...

由于

3 个答案:

答案 0 :(得分:2)

循环完成后,您的功能将被执行。因此,循环i将等于6txt将等于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);

Fiddle

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