javascript - 为什么不能使用这种 promise 语法快速发送?

标签 javascript node.js express promise

这个问题在这里已经有了答案:





How to access the correct `this` inside a callback

(13 个回答)


12 个月前关闭。




通常在使用 Promise 语法时,以下语法会产生相同的结果:

// Syntax A - works fine
getUser(id).then((user) => console.log(user)

// Syntax B - works fine
getUser(id).then(console.log)
然而,当我们在 Express 路由中尝试这样做时,只有语法 A 有效:
// Works
app.get('/syntax_a', (req, res) => {
  getUser(req.body.id).then((user) => res.json(user))
})

// Fails
app.get('/syntax_b', (req, res) => {
  getUser(req.body.id).then(res.json)
})
语法 B 产生错误:
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'app' of undefined
    at json (/server/node_modules/express/lib/response.js:256:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
为什么这不像第一个例子那样工作?

最佳答案

原因是因为response.json是函数that looks up app on this .当你通过 res.json你正在通过json没有对它来自的对象的任何引用,所以它的 this是(最有可能)undefined )。 this JavaScript 是动态绑定(bind)的,而不是像 C# 或 Java 这样的语言中的静态绑定(bind)。console.log另一方面不使用 this因此不受您如何调用它的影响。
我们可以自己构建这样的东西:

let _privateImplementation = (...args) => console.log(...args);

let ourPrivateBoundExample = {
  doIt(some, info) {
    _privateImplementation("Doing it", some, info);
  }
}

ourPrivateBoundExample.doIt(1, 2); // Doing it 1 2
Promise.resolve("Hello there!")
  .then(ourPrivateBoundExample.doIt) // Doing it Hello there!

关于javascript - 为什么不能使用这种 promise 语法快速发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69056090/

相关文章:

javascript - itms-services 使用 javascript 重定向

javascript - 为什么安装 npm 软件包会重新安装所有其他软件包?

javascript - 如何导入 socket.io npm 包 - Node Js

php - 有一些酒吧不是 highcharts 上的 url 链接

javascript - 滚动到 jcarousel 的第一项

express - 如果未提供凭据,如何使用 express-basic-auth 以便我的应用程序返回 401?

json - 查询 API 时,我在传递给 "Assertion failed: You must include an ` 的哈希中得到 `push` id`

express - 我可以在 SendGrid 模板中使用带有替换标签的图像吗?

javascript - 通过他的URL动态定义图片的宽度是真的吗?

node.js - 使用 epilogue/finale-rest,我如何通过 multer 接受二进制文件?