簡體   English   中英

快遞| 異步發出多個http請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM