今天发生了一件让我非常惊讶的事情。我遇到了一堆 express 路由处理程序,基本上是这样的(有更多真正的函数调用,但为了易读性:
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)
})
但是当我尝试这样做时,我从未得到响应并在节点控制台中看到这一点:
在我看来 .then(resp.json) 和 .then(data=>resp.json(data)) 应该是等价的。可以肯定的是,这是一个范围的事情,但我想要一个解释,也许是一个解决方法。
最佳答案
这是因为 resp
是一个具有自己属性的对象,所以 json
函数使用的数据很可能包含在 resp
对象中。
当您将函数 resp.json
本身传递给 then
时,您不会同时传递 resp
对象或其任何信息。 本质上,then
调用只是从 json
对象 中“借用”了函数 resp
。只是函数体本身,没有作用域或隐式值。
很可能, json
的函数体在某处使用 this
,此时您将获得一个无效(可能是全局)对象,而不是 resp
。
为了补救,你可以这样做
Promise.resolve({one: 1})
.then(resp.json.bind(resp))
关于javascript - 以无点方式表达和调用 response.json 在 Promise.then 中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40898327/