Node.js并行调用相同的子rest服务并聚合响应

我想从父母rest服务打电话给孩子rest服务。 子服务被调用的次数取决于父rest服务的参数。 一旦我用不同的参数同时调用所有的子服务实例。 我想结合来自所有子服务实例的响应。 我正在使用下面的代码段。 但我不想使用超时。 它应该是超时,或者当所有的小孩服务的呼叫都结束的时候,哪一个更less。

for( i=0; i<length; i++) { url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; micro(url ,filter[i],function(resp) { this.resutlObject[count]=resp; console.log("count"+count); count=count+1; }.bind( {resutlObject: resutlObject} )); }//end of for setTimeout(function () { console.log("in time out"); res.end(JSON.stringify(resutlObject || {}, null, 2)); },500); 

您可以使用asynchronous模块asynchronous 。 它提供了并行的foreach循环。

 var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; var configs = {}; async.forEachOf(obj, function (value, key, callback) { fs.readFile(__dirname + value, "utf8", function (err, data) { if (err) return callback(err); try { configs[key] = JSON.parse(data); } catch (e) { return callback(e); } callback(); }) }, function (err) { if (err) console.error(err.message); // configs is now a map of JSON data doSomethingWith(configs); }) 

在这个例子中,它正在读取参数中列出的文件。 同样你可以为你的任务做

你可以使用asynchronous模块 。 它旨在做你以后的东西。 像这样的东西:

 var async = require('async'); var collection = []; for(i=0;i<length;i++) { collection.push( (function(i) { return function(callback) { url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; micro(url ,filter[i],function(resp) { callback(null, resp); }); } })(i) ); }//end of for async.parallel(collection, function(err, results) { console.log(results) // array of results from all requests }) 

怎么了

async.parallel以一个函数数组作为参数。 每个函数接收callback作为参数。 callback是一个函数,它将errorresult作为参数。

在所有的callback执行async调用最后一个callback,从其他所有callback接收结果数组。

在循环中,我们正在创build一个函数集合。 在这个例子中,代码有点复杂,因为我们使用闭包来保存每个函数的i的值。

你也可以使用Promise。 假设service调用返回promise,那么你等待所有的都完成了。 Node.js支持从v4开始的promise。 如果你有早期版本的节点,只需使用一些库 。

 //Instead of function micro(url, filter, cb) { var resp = "result of async job";//do some async work cb(resp) } //Modify your service to return a promise function micro(url, filter) { return new Promise(function(resolve, reject) { var resp = "result of async job using `url` and `filter`"; if (resp) { resolve(resp); } else { reject("reason"); } }); } //Create a list of service calls. var promises = []; for( i=0; i<length; i++) { url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; promises.push(micro(url, filter[i])); } //Wait for all off them to fulfill Promise.all(promises) .then(function(resultObject) { //Response res.end(JSON.stringify(resultObject || {}, null, 2)); }, function(reason) { res.sendStatus(500); console.error(reason); });