我有点坚持如何处理这个解决方案。我目前正在使用的框架是node.js和express.js,其中包含用于视图/渲染html的pug。我想要做的是渲染到单个页面并使用来自不同站点的单独http get请求的值。我希望express / node查询外部api并呈现我将通过客户端javascript的ajax调用检索的视图。我已经想到了使用客户端jquery的ajax调用。我的问题是如何处理多个外部API调用并将结果放入一个对象中以在我的哈巴狗视图中呈现。我不确定执行此操作的最佳做法是什么。我创建一个模型吗?另外,我如何处理异步http获取?使用承诺?我是节点和javascript的新手,所以我试图看看使用哪种最佳约定。 我希望这是有道理的。
感谢!!!!
apiInfoModel.js
var apiCallInfo = {
apiInfo1: APIDATA
apiInfo2: APIDATA2
apiInfo3: APIDATA3
}
我应该使用一个可以返回APIDATA的函数吗?
apiCalls.js
function getApiInfo1() {
return http.get
}
function getApiInfo2() {
return http.get
}
function getApiInfo3() {
return http.get
}
apiInfoController.js
var apiInfo = require('./apiInfoModel')
var apiCalls = require('./apiCalls')
exports.apiInfo = function(req,res,next){
apiInfo.apiInfo1 = apiCalls.getApiInfo1
apiInfo.apiInfo2 = apiCalls.getApiInfo2
apiInfo.apiInfo3 = apiCalls.getApiInfo3
res.render('apiInfo',{apiInfo: apiInfo})
}
答案 0 :(得分:1)
扩大@Mauricio Noris Freire的评论
apiCalls.js - 添加callback
参数
function getApiInfo1(cb) {
return cb(http.get)
}
function getApiInfo2(cb) {
return cb(http.get)
}
function getApiInfo3(cb) {
return cb(http.get)
}
apiInfoController.js - 嵌套回调以访问所有结果
var apiInfo = require('./apiInfoModel')
var apiCalls = require('./apiCalls')
exports.apiInfo = function(req,res,next){
apiCalls.getApiInfo1(function(info1Result) {
apiCalls.getApiInfo2(function(info2Result) {
apiCalls.getApiInfo3(function(info3Result) {
// now you have all 3 results
apiInfoResult = {
apiInfo1: info1Result,
apiInfo2: info2Result,
apiInfo3: info3Result
}
res.render('apiInfo', { apiInfo: apiInfoResult })
});
});
});
}
这种嵌套结构称为pyramid of doom
,因为它随着您需要执行的每个异步操作而不断增长。可以使用像async
https://www.npmjs.com/package/async:
async.parallel( [
apiCalls.getApiInfo1,
apiCalls.getApiInfo2,
apiCalls.getApiInfo3
], function(error, apiInfoResult) {
apiInfoResult = {
apiInfo1: info1Result,
apiInfo2: info2Result,
apiInfo3: info3Result
}
res.render('apiInfo', { apiInfo: apiInfoResult })
});
但目前推荐的方法是使用Promises
。这是API
中引入的新JavaScript
来处理这种情况。它在最近的NodeJS
版本中可用。它不再需要callbacks
:
apiCalls.js - 返回承诺而不是使用callbacks
(fetch
库执行此操作)
require('whatwg-fetch')
function getApiInfo1() {
return fetch()
}
function getApiInfo2() {
return fetch()
}
function getApiInfo3() {
return fetch()
}
apiInfoController.js - 使用Promise.all
。
const [
apiInfo1,
apiInfo2,
apiInfo3
] = Promise.all([apiCalls.getApiInfo1, apiCalls.getApiInfo2, apiCalls.getApiInfo3]);
apiInfoResult = { apiInfo1, apiInfo2, apiInfo3 }
res.render('apiInfo', { apiInfo: apiInfoResult })