为啥我不能内联调用 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.json
和console.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?的主要内容,如果未能解决你的问题,请参考以下文章