【问题标题】:Why cant I inline call to res.json?为什么我不能内联调用 res.json?
【发布时间】:2013-08-03 13:51:03
【问题描述】:

我有一个 expressjs 应用程序,在特定的路由上,我调用了一个函数,该函数通过调用 res.json 以数据库文档作为参数来响应数据库中的用户。我使用基于承诺的库,我想内联回调,我将数据库文档放入响应中。但是当我这样做时程序失败了。有人可以解释为什么吗?我也想知道为什么对console.log 的内联调用确实有效。 res.jsonconsole.log这两种方法有什么根本区别吗?

下面是一个例子,说明什么有效,什么无效。假设 getUserFromDatabase() 返回一个用户文档的承诺。

//This works
var getUser = function(req, res) {
    getUserFromDatabase().then(function(doc) {
        res.json(doc);
    });    
} 

//This does not work (the server never responds to the request)
var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json);    
} 

//This works (the object is printed to the console)
var printUser = function(req, res) {
    getUserFromDatabase().then(console.log);    
} 

【问题讨论】:

标签: javascript node.js express promise


【解决方案1】:

json 函数在这样使用时会丢失其正确的 this 绑定,因为 .then 将直接调用它而不引用 res 父对象,因此绑定它:

var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json.bind(res));    
}

【讨论】:

  • 在设计 res 对象时,这会被认为是库中的缺陷还是无法解决?
  • 这就是 JavaScript 的工作原理。 res.json 函数可以由库为您预先绑定,但这在 javascript 中是非常规的。 CoffeeScript 允许使用粗箭头 ("=>") 运算符预先绑定面向对象的方法,仅供参考。
  • @LudwigMagnusson res.json 不是函数而是方法——这意味着它依赖于this。虽然在这种情况下可能会很烦人,但它比需要携带上下文的函数要好得多,因为它可以静态分配。 Response 类可以自动绑定其方法,但是当 res.json 可以作为方法正常调用时(大多数情况下可以),这是一个巨大的性能损失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多