繁体   English   中英

以免费方式表达和调用response.json在Promise.then中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM