如何从外部作用域将变量传递给.then()回调函数?

时间:2015-11-27 22:30:32

标签: javascript node.js mongodb mongoose promise

我有一个API接收请求并进行一些查询和验证。

我想使用response函数中路由的findUserPlayer引用,以便我可以向客户端发送内容。 findUser函数将返回将在data上使用的findUserPlayer对象。

var api = express.Router();

api.post('/signup', function (request, response) {

    UserModel.find(req.body)
        .then(findUser, createUser)
        .then(findUserPlayer, createUserPlayer);
});

var findUserPlayer = function (data, res) {
    //...
    res.json(object);
};
  • 我已尝试拨打findUserPlayer(data, res),这样我就无法定义数据'。
  • 我尝试拨打findUserPlayer(res),会覆盖data

如何在回调中使用response对象?

3 个答案:

答案 0 :(得分:1)

您可以定义成功处理函数,然后调用findUserPlayer,而不是直接将 findUserPlayer 函数作为成功处理函数传递。

var api = express.Router();

api.post('/signup', function (request, response) {

    UserModel.find(req.body)
        .then(findUser, createUser)
        .then(function(data) {
            return findUserPlayer(data, response);
        }, createUserPlayer);
});

var findUserPlayer = function (data, res) {
    //...
    res.json(object);
};

答案 1 :(得分:1)

JavaScript是一种非常灵活的语言,这意味着您可以通过多种方式处理此问题,最简单的方法之一(就最小代码更改而言)是颠倒findUserPlayer中的参数顺序并绑定您的上下文( .bind(response))。

但那将是一个糟糕的设计选择。找不到用户的功能没有理由"处理回应或json。它的功能范围和责任不在此范围内。请求处理程序是应该处理格式化相关响应的处理程序,我通过在promise链中返回相关数据并最终执行此操作:

.then(function(data) {
   response.json(data);
});

答案 2 :(得分:1)

我是lodash的忠实粉丝,有时也是一个错误,但我想我会使用lodash的partialRight函数添加以下内容。

var _ = require('lodash');
...
UserModel.find(req.body)
    .then(findUser, createUser)
    .then(_.partialRight(findUserPlayer, response), createUserPlayer);

_.partialRight返回一个新函数,其中partials附加到新函数。 _.partialRight的第一个参数是我们想要追加参数的函数。后续参数是我们想要附加到函数的参数。

我假设以下函数签名:findUserPlayer(data, response)_.partialRight将响应对象附加到新函数。新功能签名现在看起来像这样:function (data)

documentation