Javascript 如何在nodejs中生成一系列带动态参数的并行API请求
我想进行一系列API调用,根据数组中存储的参数值(大约30-40个值)更改URL中的单个参数值。我正在使用NodeJS和Express。以下是我为此编写的一个片段: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 =
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;