如何在nodejs中使用dynamic参数进行一系列并行API请求

我想根据存储在数组中的参数值(大约30-40个值),通过更改URL中的单个参数值进行一系列API调用。 我正在使用NodeJS和Express。 以下是我为此写的一个片段:

var express = require('express'); var router = express.Router(); var rest = require('restler'); router.get('/myroute', function(req, res, next){ parameterArray = [ /* A list of parameter values in here gathered from two more API calls */]; returnArray = []; for(var i = 0; i < parameterArray.length; i++){ var url = 'https://api.example.org?parameter=' + parameterArray[i]; rest.get(url).on('success', function(data){ // after some processing on data returnArray.push(processedData); }); } res.json(returnArray); }); module.exports = router; 

我有两个问题:

1.)目前router.get('/myroute')大约需要40-50秒完成并返回。 我将如何使他们更快? 我已经看了node-webworker-threads 。 有没有更好的select?

2.)在上面的代码中,路由器函数router.get('/myroute')返回returnArray因为restler进行asynchronous调用。 我怎样才能确保该函数只有在收到所有的API请求(并将处理的数据推送到returnArray )之后才返回。

1)这很大程度上取决于你的ajax调用(另一端的networkingstream量和服务器处理)的响应,所以不确定你是否真的可以用multithreading加速。

2)rest.get()是一个asynchronous调用。 使用常规for循环将无法正常工作,因为它不会等待所有ajax调用完成。 这就是为什么returnArray是空的。 你可以使用async.each()(并行处理),但是我build议你使用async.eachLimit(),这样可以节制ajax调用的数量。 如果你的服务器不能同时处理那么多的事务,那么将这些数据冲入你的服务器可能不是一个好主意。 这里是修改后的代码(注意,我一次只能调用5个Ajax调用,可以使用这个数字来看看对你来说最好的):

 var express = require('express'); var router = express.Router(); var rest = require('restler'); var async = require('async'); router.get('/myroute', function(req, res, next){ var parameterArray = [ /* A list of parameter values in here gathered from two more API calls */]; var returnArray = []; async.eachLimit(parameterArray, 5, function(param, eachCb) { var url = 'https://api.example.org?parameter=' + param; rest.get(url).on('complete', function(data){ var processedData; // after some processing on data returnArray.push(processedData); eachCb(null); }); }, function(err) { // done with all ajax calls res.json(returnArray); }); }); module.exports = router;