javascript - 如何将 "transfer"变量传递到 Node Express 路由器中的 Promise 链?

标签 javascript node.js express promise router

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

我的问题是我无法在第二个 promise 中访问变量 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);
    });
});

另一次尝试,这里尝试将路由器绑定(bind)到 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);
    });
});

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

最佳答案

利用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);
    }
}));

关于javascript - 如何将 "transfer"变量传递到 Node Express 路由器中的 Promise 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35744492/

相关文章:

javascript - 合并数组中的对象而不覆盖不同的值属性

javascript - HTML 中 Angular ng- 属性的安全问题及缓解措施

javascript - 对象不可迭代 - NodeJS

JavaScript 克隆对象丢失其原型(prototype)函数

javascript - 使用 Nodejs 在 HTML 中的一个表行中包含两个数组

javascript - 这是什么cordova构建错误\ip-regex\index.js :3?

ember.js - 如何为 Ember.js + Express 设置开发环境

node.js - 如何更新 Node.js 和 Mongoose 中对象数组中的特定对象

javascript - req.param 在服务器端给出未定义 : nodejs

javascript - Node JS - 构建 OAuth2 请求