[英]Express | Making multiple http requests asynchronously
我目前正在構建一個小型節點應用程序,該應用程序會進行一些api調用並呈現一個帶有圖表的網頁。 我正在使用express和jade作為渲染引擎。
問題是我對javascript很陌生,而且我不知道如何計划我的http請求,因此當有多個請求時,我可以傳遞從api(http get)獲得的變量對象。 我不知道如何將其映射為單個對象並將其發送到玉渲染引擎。
這是我到目前為止所擁有的:
app.get('/test', function(req, res) {
apiRequestGoesHere(name, function(error, profile) {
//Get some data here
});
anotherApiRequest(tvshow, function(error, list) {
//Get some data here
});
res.render('test', data);
});
目前,頁面渲染和請求尚未完成,如果我將res.render放置在一個請求中,則無法訪問另一個數據。
所以我想要的是一種設置方法,這樣我可以進行多個api調用,然后根據其余api返回給我的某些元素制作一個對象,並將其發送給Jade,這樣我就可以使用頁。
您可能想使用異步來解決這個問題。 對於這樣的簡單事情, async.parallel
是一個不錯的選擇:
app.get('/test', function(req, res) {
async.parallel([
function(next) {
apiRequestGoesHere(name, function(error, profile) {
//Get some data here
next(null, firstData);
});
},
function(next) {
anotherApiRequest(tvshow, function(error, list) {
//Get some data here
next(null, secondData);
});
}], function(err, results) {
// results is [firstData, secondData]
res.render('test', ...);
});
});
如果相關, next
這些函數的第一個參數應該是一個錯誤(我置為null
)-一旦一個錯誤被調用,最后一個函數將被相同的錯誤調用,其余的回調將被忽略。
您可以異步並行 。
async.parallel([
function(callback){
// Make http requests
// Invoke callback(err, result) after http request success or failure
},
function(callback){
// Make http requests
// Invoke callback(err, result) after http request success or failure
}
],
// optional callback
function(err, results){
// the results array will be array of result from the callback
});
您的頁面呈現的原因是回調尚未“回調”。 要執行您想要的操作,您需要執行以下操作:
app.get('/test', function(req, res) {
apiRequestGoesHere(name, function(error, profile) {
//Get some data here
anotherApiRequest(tvshow, function(error, list) {
//Get some data here
res.render('test', data);
});
});
});
這種策略導致了所謂的“金字塔代碼”,因為嵌套的回調函數的結局越來越深。
我還建議Tim Caswell編寫步驟庫。 這會使您的代碼看起來像這樣:
var step = require('step');
app.get('/test', function(req, res) {
step(
function () {
apiRequestGoesHere(name, this)
},
function (error, profile) {
if error throw error;
anotherApiRequest(tvshow, this)
},
function done(error, list) {
if error throw error;
res.render('test', list)
}
)
});
您還可以使用group
方法並行進行調用,並且仍然保持回調的順序。
亞倫GL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.