nodejs循环async.parallel回调

时间:2016-12-17 23:27:08

标签: javascript node.js callback async.js

我正在测试async.parallel函数调用的回调:如果回调使用参数或没有参数,似乎执行流程不同。

var async = require("async");

function makeTestFunction(i) {
	return function(callback) {
		console.log('test Function: '+i);
		return callback();
	};
}

function test(callback) {
	var endFunctions = function(i) {
		console.log('ending: ' + i);
		return callback();
	};
	var testFunctions = [];
	for (var i=0; i < 3; i++) {
		console.log('loop: '+i);
		testFunctions.push(makeTestFunction(i));
	}
	return async.parallel(testFunctions, endFunctions );
}

test( function() {
	console.log('--------------- end test 1');
});
// loop: 0
// loop: 1
// loop: 2
// test Function: 0
// test Function: 1
// test Function: 2
// ending: null
// --------------- end test 1

结果就是我所期望的:在所有函数完成后调用'endFunctions'回调。

现在我希望匿名函数回调返回一个值:

var async = require("async");

function makeTestFunction(i) {
	return function(callback) {
		console.log('test Function: '+i);
		return callback(i);
	};
}

function test(callback) {
	var endFunctions = function(i) {
		console.log('ending: ' + i);
		return callback();
	};
	var testFunctions = [];
	for (var i=0; i < 3; i++) {
		console.log('loop: '+i);
		testFunctions.push(makeTestFunction(i));
	}
	return async.parallel(testFunctions, endFunctions );
}

test( function() {
	console.log('--------------- end test 2');
});
// loop: 0
// loop: 1
// loop: 2
// test Function: 0
// test Function: 1
// ending: 1
// --------------- end test 2
// test Function: 2

阅读async.parralel manual,我预料到:

  1. 在所有匿名函数终止后调用一次回调'endFunctions'
  2. 回调'endFunctions'接收匿名函数返回的所有值的数组。
  3. 拜托,有人可以解释发生了什么以及出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

回调签名有什么问题。 对于async.parallel,回调必须有两个参数(错误,结果)。

以下代码给出了正确的结果:

&#13;
&#13;
var async = require("async");

function makeTestFunction(i) {
	console.log('make function: '+i);
	return function(callback) {
		console.log('test Function: '+i);
		return callback(null, i);
	};
}

function test(callback) {
	var endFunctions = function(err, result) {
		console.log('ending: ' + result);
		return callback();
	};
	var testFunctions = [];
	for (var i=0; i < 3; i++) {
		(function (k) {
			testFunctions.push(makeTestFunction(k));
		})(i);
	}
	return async.parallel(testFunctions, endFunctions );
}

test( function() {
	console.log('--------------- end test 2');
});
// make function: 0
// make function: 1
// make function: 2
// test Function: 0
// test Function: 1
// test Function: 2
// ending: 0,1,2
// --------------- end test 2
&#13;
&#13;
&#13;