Javascript 如何在nodejs中生成一系列带动态参数的并行API请求

Javascript 如何在nodejs中生成一系列带动态参数的并行API请求,javascript,node.js,multithreading,rest,express,Javascript,Node.js,Multithreading,Rest,Express,我想进行一系列API调用,根据数组中存储的参数值(大约30-40个值)更改URL中的单个参数值。我正在使用NodeJS和Express。以下是我为此编写的一个片段: var express = require('express'); var router = express.Router(); var rest = require('restler'); router.get('/myroute', function(req, res, next){ parameterArray =

我想进行一系列API调用,根据数组中存储的参数值(大约30-40个值)更改URL中的单个参数值。我正在使用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;
var express=require('express');
var router=express.router();
var rest=require('restler');
get('/myroute',函数(req,res,next){
parameterArray=[/*此处是从另外两个API调用中收集的参数值列表*/];
returnArray=[];
对于(var i=0;i
我有两个问题:

1.)当前
router.get('/myroute')
大约需要40-50秒完成并返回。我怎样才能让他们更快?我已经看过了。还有更好的选择吗

2.)在上面的代码中,路由器函数
router.get('/myroute')
返回
returnArray
空,因为
restler
进行异步调用。如何确保函数只有在接收到所有API请求(并将处理后的数据推送到
returnArray
)后才返回。这在很大程度上取决于ajax调用的响应(另一端的网络流量和服务器处理),因此不确定使用多个线程是否能真正加快速度

2) get()是一个异步调用。使用常规for循环将不起作用,因为它不会等待所有ajax调用完成。这就是返回数组为空的原因。您可以使用async.each()(并行处理),但我建议您使用async.eachLimit(),这样可以限制ajax调用的数量。如果您的服务器不能同时处理那么多事务,那么将其中的30-40个刷新到服务器可能不是一个好主意。下面是修改后的代码(请注意,我将ajax调用限制为每次5次,您可以使用这个数字来查看最适合您的代码):


非常感谢你。这很有帮助。我所说的API调用返回大约需要40秒,实际上是整个
router.get('/myroute')
所花费的时间。我已经编辑了这个问题。另外,你能告诉我每辆车是什么吗?再次感谢.async.each()的回调。与其将其命名为“callback”,不如说eachCb有点意义,通过查看代码,我马上知道这个回调来自何处。否则,当您有嵌套异步调用时,仅对所有嵌套异步调用的“回调”回调将有点混乱。
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;