【问题标题】:Strange behavior in my Hubot adapter in coffeescript on nodejsnodejs上coffeescript中我的Hubot适配器的奇怪行为
【发布时间】:2014-01-17 05:00:01
【问题描述】:

我正在为我的公司聊天系统开发 Hubot 适配器。以下代码的输出非常令人惊讶,我不知道下一步该去哪里。没有运行时错误(据我所知)

输出:

connect console
DEBUG connect logger
posted console

代码:

connect: ->
  console.log 'connect console'
  @logger.debug 'connect logger'

  @jsonClient.post 'Route/WebService/Json/Login', loginRequest, (err, res, body) ->
    console.log 'posted console'
    @logger.debug 'posted logger'

【问题讨论】:

  • 有什么令人惊讶的?没有@logger.debug 'posted logger' 输出? @jsonClient.post 在调用其回调时使用什么上下文?
  • @muistooshort 是的,这让我感到惊讶。事实上,这个例子被简化了。实际上,我想继续进行另一个 http 调用,但似乎什么也没发生。语境?不知道。我在本地类的 ctor 中实例化 jsonClient - 这能回答问题吗?

标签: node.js coffeescript hubot


【解决方案1】:

如果您希望@ 在回调函数内部与外部相同,则使用fat-arrow (=>) 定义回调:

@jsonClient.post 'Route/WebService/Json/Login', loginRequest, (err, res, body) =>
  #...

请记住,(Coffee|Java)Script 函数中的 @ (AKA this) 取决于函数的调用方式,而不是函数的定义方式或位置(当然,除非您有绑定函数...)。如果您使用=> 定义函数,那么它将绑定到当前的@@logger@jsonClient 将是您期望它们在回调中的内容。

你也可以使用Function.bind:

callback = (err, res, body) ->
  console.log 'posted console'
  @logger.debug 'posted logger'

@jsonClient.post 'Route/WebService/Json/Login', loginRequest, callback.bind(@)

如果您想要原生解决方案。

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多