[英]Express and calling response.json in a point free fashion doesn't work in Promise.then
今天有些事让我大吃一惊。 我遇到了一堆快速路由处理程序基本上看起来像这样(有更多和真正的函数调用,但为了易读性:
app.get('/api/foo', (req, resp) => {
Promise.resolve({one: 1})
.then(data=>resp.json(data))
})
所以我作为聪明的javascript程序员,认为我可以离开匿名函数,然后让then函数直接调用resp.json:
app.get('/api/foo', (req, resp) => {
Promise.resolve({one: 1})
.then(resp.json)
})
但是当我尝试时,我从来没有得到响应,并在节点控制台中看到这个:
未处理的promise promise(拒绝id:1):TypeError:无法读取undefined的属性'app'
对我来说.then(resp.json)和.then (data => resp.json(data))应该是等价的。 当然,这是一个范围的事情,但我喜欢解释,也许是一种解决方法。
这是因为resp
是一个具有自己属性的对象,因此json
函数使用的数据很可能包含在resp
对象中。
当您将函数resp.json
自身传递给then
,您没有传递resp
对象或其任何信息。 本质上, then
调用只是从resp
对象“借用”函数json
。 只是函数体本身,没有范围或隐含值。
更可能的函数体json
使用this
地方,这时你会得到的,而不是无效的(可能是全球)对象, resp
。
为了补救,你可以做到
Promise.resolve({one: 1})
.then(resp.json.bind(resp))
它们不一样,因为this
运算符在javascript中是如何工作的 。
基本上, resp.json(data)
使用this===resp
调用该函数,而resp.json
使用this===global
调用该函数。
要修复它,请使用绑定参数传递函数。然后.then(resp.json.bind(resp))
(或使用箭头函数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.