javascript - 如何在 nodejs 中结合 API GET 请求?
问题描述
我在 nodejs 中一次有几个 API Get 请求。每个 API 每隔几分钟就会有新数据。
var express = require('express');
var router = express.Router();
var request = require("request");
let value1, value2, bodyData1, bodyData2;
var options = { method: 'GET',
url: 'https://api.example.com/data1',
qs:
{
valueType: 'MAXIMUM'
},
headers:
{
authorization: 'ABC123456',
accept: 'application/json; charset=utf-8' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
bodyData1 = JSON.parse(body);
value1 = bodyData1.value;
});
var options = { method: 'GET',
url: 'https://api.example.com/data2',
qs:
{
valueType: 'MAXIMUM'
},
headers:
{
authorization: 'ABC123456',
accept: 'application/json; charset=utf-8' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
bodyData2 = JSON.parse(body);
value2 = bodyData2.value;
});
router.get('/', function(req, res, next) {
res.render('home', {valueA : value1, valueB: value2});
});
module.exports = router;
我想知道是否可以将它们组合成一个功能?还有什么我应该关心的吗?
解决方案
如果您有当前没有的承诺,这是可能的。你必须把你的request()
电话包装在一个 Promise 中。您可以使用自定义功能手动完成requestToPromise
。
然后,您可以使用Promise.all
并行调用多个承诺。
function requestToPromise(options) {
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) return reject(error);
resolve(body);
});
});
}
var optionsRequest1 = {
method: "GET",
url: "https://api.example.com/data1",
qs: {
valueType: "MAXIMUM"
},
headers: {
authorization: "ABC123456",
accept: "application/json; charset=utf-8"
}
};
var optionsRequest2 = {
method: "GET",
url: "https://api.example.com/data2",
qs: {
valueType: "MAXIMUM"
},
headers: {
authorization: "ABC123456",
accept: "application/json; charset=utf-8"
}
};
var requestPromise1 = requestToPromise(optionsRequest1);
var requestPromise2 = requestToPromise(optionsRequest2);
Promise.all([requestPromise1, requestPromise2]).then(results => {
var [resultPromise1, resultPromise2] = results;
}).catch(error => {
//handle error
});
除了使用自定义功能requestToPromise
,您还可以使用util.promisify
const util = require('util');
const requestAsync = util.promisify(request);
Promise.all([requestAsync(optionsRequest1), requestAsync(optionsRequest2)]).then(results => {
var [resultPromise1, resultPromise2] = results;
}).catch(error => {
//handle error
});
推荐阅读
- opengl - 在不使用统一变量的情况下丢弃片段着色器上的随机片段
- javascript - 创建自定义 GeoJSON 组件的好方法是什么
- excel - VBA Listview 使用列名设置和获取
- c# - 如何保持我的 (.NET Core) 依赖注入配置可维护?
- rust - 参考特征:没有实现 `&T * &T`
- c++ - 如何模拟调用其基类方法的派生类?
- typo3 - TYPO3 CMS 8.7.27:在 null 上调用成员函数 getPackagePath()
- javascript - 如何将带有链接作为类名的跨度转换为链接
- django - 如何保存我的 ForeignKey 的属性?
- python - 不使用 keras 后端库的自定义损失函数