【问题标题】:Why do nodejs function arguments behave differently when called explicitly? [duplicate]为什么 nodejs 函数参数在显式调用时表现不同? [复制]
【发布时间】:2017-12-06 18:46:01
【问题描述】:

我正在重构我的nodejs应用程序并试图让代码看起来更干净,然后我在直接调用函数时遇到了这个问题。

这行得通:

router.route('/').get(({ query }, res, next) => {
ItemsLogic.getItems(query)
  .then((items) => res.json(items))
  .catch(next)

})

但这会引发错误:

router.route('/').get(({ query }, res, next) => {
ItemsLogic.getItems(query)
  .then(res.json)
  .catch(next)

})

错误是:“无法读取未定义的属性‘app’”。它在快速响应的json() 函数中,与该方法中的this 对象有关,由于某种原因未定义。

【问题讨论】:

  • @abhishekkannojia — 你不能传递“语句”(除非你把它们放在字符串中成为evaled)。 res.json 的值是一个函数。
  • @Quentin 是的,你是对的。没有意识到res.json 是一个函数。我想这就是当您没有正确浏览代码时会发生的情况。感谢您的澄清。
  • 要完成这项工作,只需通过:.then(res.json.bind(res))
  • @binariedMe 你会把它作为答案吗?这实际上对我有用
  • @binariedMe 你认为什么更优雅? (items) => res.json(items) 或 res.json.bind(res)

标签: javascript node.js express promise es6-promise


【解决方案1】:

函数内this的值取决于它的调用方式。

给定res.json();thisres

鉴于var foo = res.json; foo();this 不是 res

json 函数关心this 的值。通过传递res.json,您将获取json(函数)的值并将其与res 断开连接,就像上面的第二个示例一样。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2013-12-08
    • 2020-07-23
    • 2022-10-15
    • 2015-03-21
    • 2016-12-05
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多