今天发生了一件让我非常惊讶的事情。我遇到了一堆 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/

10-10 13:11