arrays - 如何并行运行 API 调用 (Node.js)
问题描述
我正在尝试并行运行一些 API 调用,但由于我试图在返回 API 数据之前再次调用函数而遇到问题。
我在想我可以new
在 Node 中使用该命令,但不知道如何将它构建到这个方案中。我试图避免递归,因为我已经有一个递归版本在工作,而且速度很慢。
目前我正在尝试在服务器上使用此代码。
loopThroughArray(req, res) {
for(let i=0; i<req.map.length; i++) {
stack[i] = (callback) => {
let data = getApi(req, res, req.map[i], callback)
}
}
async.parallel(stack, (result) => {
res.json(result)
})
}
……
function getApi(req, res, num, cb) {
request({
url: 'https://example.com/api/' + num
},
(error, response, body) => {
if(error) {
// Log error
} else {
let i = {
name: JSON.parse(body)['name'],
age: '100'
}
console.log(body) // Returns empty value array.length > 1 (req.map[i])
cb(i)
}
})
有没有办法在每次调用它时生成函数的新实例并累积结果以作为一个结果发送回客户端?
解决方案
这是一个调用 Web API 的示例(每个都有不同的参数),使用 Async 库,我们首先创建一个包含 N 个函数变量的数组。
const async = require('async');
const request = require('request');
//Set whatever request options you like, see: https://github.com/request/request#requestoptions-callback
var requestArray = [
{url: 'https://httpbin.org/get'},
{url: 'https://httpbin.org/ip'}
];
let getApi = function (opt, callback) {
request(opt, (err, response, body) => {
callback(err, JSON.parse(body));
});
};
const functionArray = requestArray.map((opt) => {
return (callback) => getApi(opt, callback);
});
async.parallel(
functionArray, (err, results) => {
if (err) {
console.error('Error: ', err);
} else {
console.log('Results: ', results.length, results);
}
});
您可以轻松切换 Url 和 Query 值以匹配您需要的任何内容。我在这里使用 HttpBin,因为它有利于说明目的。
推荐阅读
- html - 强制表格元素填充表格的整个长度
- java - 将Android库集成到cocos2D for Android release(调用JavaScriptJavaBridge_callStaticMethod失败)
- python - random.choice 总是打印相同的结果
- javascript - 具有更多钩子的上下文 API
- security - How to add HTTP Headers to Jenkins
- node.js - 承诺不解决快递
- python - 如何在python中使用正则表达式从字节中提取单词?
- linux - 错误 [: ==: shell 脚本中需要一元运算符
- android - FlutterPusher 在发布版本中未连接到主机
- raspberry-pi - Linux通过usb串口通信