nodejs循环async.parallelcallback
我正在testing一个由async.parallel函数调用的callback函数:如果callback函数使用参数或者没有,那么执行stream程似乎是不同的。
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
结果是我所期望的:在完成所有function之后调用“endFunctions”callback函数。
现在我想要匿名函数callback来返回一个值:
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手册 ,我预计:
- 在所有的匿名函数被终止后,callback'endFunctions'被调用一次
- callback'endFunctions'接收由匿名函数返回的所有值的数组。
请问,有人可以解释发生了什么,什么是错的?
callback签名有什么问题? 对于async.parallel,callback函数必须有两个参数(err,results)。
以下代码给出了正确的结果:
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