2015-01-25 2 views
1

У меня есть функция async, которую я хочу выполнить для i в диапазоне. Я попытался это: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 ...

Благодаря

+0

Что такое в 'а' и «б»? –

+0

@ThomasBormans 'main (1,5)' –

ответ

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, которые решить эту проблему.

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

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