如何从外部范围将变量传递给.then()回调函数

How to pass in a variable to a .then() callback function from an outer scope?

本文关键字:then 函数 回调 从外部 范围 变量      更新时间:2023-09-26

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

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

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对象?

您可以定义一个成功处理程序函数,然后调用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);
};

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

但这将是一个糟糕的设计选择。一个"查找用户"的函数没有理由处理响应或json。它超出了这个职能范围和职责。请求处理程序应该处理格式化相关响应的问题,我会通过返回promise链中的相关数据来实现这一点,最终:

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

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

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

CCD_ 12返回一个新函数。_.partialRight的第一个参数是我们要将参数附加到的函数。随后的参数是我们想要附加到函数的参数。

我假设以下函数签名:findUserPlayer(data, response)。CCD_ 15将响应对象附加到新函数中。新的函数签名现在看起来是这样的:function (data)

文档