为什么不能使用这种 promise 语法表达发送?
Why can't express send using this promise syntax?
通常在使用 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
)。 JavaScript 中的 this
是 动态 绑定,而不是像 C# 或 Java.
这样的语言中的静态绑定
另一方面,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!
通常在使用 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
)。 JavaScript 中的 this
是 动态 绑定,而不是像 C# 或 Java.
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!