繁体   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