节点异步推送循环
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);
}
PS 在ECMAScript 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);
想提供我的解决方案
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");
} );
我有一个异步函数,我想在一个范围内为我执行。我试过了:
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);
}
PS 在ECMAScript 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);
想提供我的解决方案
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");
} );