0

所以我目前正在构建一个用于学习的小型个人应用程序,我有一个场景,我要使用其他第三方的 API,但有几个用于 1 个对象。例如,我有 1 个要呈现的仪表板,我想对不同的地方进行不同的调用,并生成一个包含三个请求响应的数据对象。

例如,目前我有一些(类似于)下面的东西,它发出请求并返回该数据,以及来自 find 方法和当前用户会话的其他数据。效果很好。

app.get('/profile', isLoggedIn, function(req, res) {
    Object.find().exec(function (err, records) {
        request('firstUrl', function(err, resp, body) {
            res.render('profile.ejs', {
                user : req.user,
                records : records,
                responseData : JSON.parse(body)
            });
        });
    });
});

但现在我想提出超过 1 个请求......所以我不确定如何去做以及最佳实践?

下面的感觉就像它不会工作和混乱:

app.get('/profile', isLoggedIn, function(req, res) {
    Object.find().exec(function (err, records) {
        request('firstUrl', function(err, resp, body1) {
            request('secondUrl', function(err, resp, body2) {
                request('thirdUrl', function(err, resp, body3) {
                    res.render('profile.ejs', {
                        user : req.user,
                        records : records,
                        responseData1 : JSON.parse(body1),
                        responseData2 : JSON.parse(body2),
                        responseData3 : JSON.parse(body3)
                    });
                });             
            });
        });
    });
});

任何人都可以对此有所了解吗?

4

1 回答 1

1

您可能会发现async.js有助于让您的代码远离“回调地狱”。特别是并联串联方法。

例如(未测试):

async = require('async');

app.get('/profile', isLoggedIn, function(req, res) {
    async.parallel({
        records: function(callback) {
            Object.find().exec(function (err, records) {
                callback(null, records);
            });
        },
        responseData1: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        }, 
        responseData2: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        },
        responseData3: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        },
    },
    function(err, results) {
        res.render('profile.ejs', {
            user : req.user,
            records : results.records,
            responseData1 : results.responseData1,
            responseData2 : results.responseData2,
            responseData3 : results.responseData3
        });
    });
});

并行方法还可以采用函数数组而不是对象,这也可能对您有用。看看文档。

如果您计划通过请求获取可变数量的 URL,则重构代码以使用 async.js 的 queue 或 cargo 方法而不是为要加载的每个 URL 重复相同的代码可能是有意义的。

于 2015-03-12T13:47:37.177 回答