【问题标题】:How to "transfer" variables down the promise chain in node express router?如何在节点 Express 路由器中沿承诺链“传输”变量?
【发布时间】:2016-03-02 10:26:53
【问题描述】:

我试图在一个 Promise 链中进行两个单独的 DB 调用,尽管出于测试目的,第一个调用被一个传递的简单字符串替换。

我的问题是我无法在我的第二个承诺中访问变量 msg(我尝试设置 context.foo = msg。

router.route("/")
.get(function(request, response) {

    var session = request.session;

    return new Promise(function(resolve, reject) {

        resolve("h!");

    }).then(function(msg){

        return new Promise(function(resolve, reject) {

            Snippet.find({}, function(error, data) {
                let context = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                  foo: msg
                };
                resolve(context);
            });
        });

    }).then(function(context){
        response.render("start/index", context);
    }).catch(function(err){
        response.end(err);
    });
});

另一个尝试,这里尝试将路由器绑定到 promise...

 router.route("/")
.get(function(request, response) {

    var session = request.session;

    return new Promise(function(resolve, reject) {

        resolve("hi!");

    }).then(function(msg){

        router.msg = msg;

        return new Promise(function(resolve, reject) {

            Snippet.find({}, function(error, data) {
                let context = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                  foo: this.msg
                };
                resolve(context);
            }.bind(router));
        });

第三次尝试...

router.route("/")
.get(function(request, response) {

    var session = request.session;

    return new Promise(function(resolve, reject) {

        context.msg = "hi!";

        resolve(context);

    }).then(function(context){

        return new Promise(function(resolve, reject) {
            Snippet.find({}, function(error, data) {
                context.snippets = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                };
                resolve(context);
            });
        });

    }).then(function(context){
        response.render("start/index", context);
    }).catch(function(err){
        response.end(err);
    });
});

所以基本问题始终是,当我没有周围对象时,我如何“注入”或使用 Promise 范围内的变量,没有“this”将它附加到 =)

【问题讨论】:

  • 第一个代码 sn-p 看起来不错,它应该可以工作。您可以尝试使用console.log 跟踪msg 以了解发生了什么。您可以查看代码的简化 jsfiddle 版本:jsfiddle.net/pogLza0q
  • 您需要在Snippet.find() 回调中使用if(error) reject(error);。那时的错误可能是问题,也可能不是问题,但reject() 无论如何都应该存在。
  • 我会在这里使用bluebird coroutine。它会让你的生活更简单。

标签: javascript node.js express promise router


【解决方案1】:

使用bluebird强大的Promise.coroutine()

router.route("/")
.get(Promise.coroutine(function*(request, response) {
    try {
        const dbResult1 = yield getValueFromDatabaseAsync(/* w/e */);
        const dbResult2 = yield getValueFromDatabaseAsync(/* w/e, can be dbResult1 */);

        const context = {...}; // use dbResult1 and dbResult2 here normally
        response.render("start/index", context);
    } catch (err) {
        response.end(err);
    }
}));

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2020-04-07
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多