为啥我不能内联调用 res.json?

Posted

技术标签:

【中文标题】为啥我不能内联调用 res.json?【英文标题】: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);    
 

【问题讨论】:

看起来是绑定问题。 alistapart.com/article/getoutbindingsituations 【参考方案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 可以作为方法正常调用时(大多数情况下可以),这是一个巨大的性能损失。

以上是关于为啥我不能内联调用 res.json?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在初始页面加载时多次调用 React Ref 回调(作为箭头函数或内联函数)?

C++ 为啥要引入内联函数、、

为啥我不能在我的类中内联函数? [复制]

为啥我不能内联创建新的 Java 数组? [复制]

为啥我不能内联创建新的 Java 数组? [复制]

为啥我的 <legend> 元素不能内联显示?