Странное поведение моего адаптера Hubot в coffeescript на nodejs

Я работаю над адаптером 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'

person James L    schedule 16.01.2014    source источник
comment
Что удивительно? Что нет @logger.debug 'posted logger' выхода? Какой контекст использует @jsonClient.post при вызове своих обратных вызовов?   -  person mu is too short    schedule 16.01.2014
comment
@muistooshort да, вот что меня удивляет. На самом деле этот пример упрощен. На самом деле я хочу сделать еще один http-вызов в продолжении, но ничего не происходит. Контекст? Без понятия. Я создаю экземпляр jsonClient в ctor локального класса - это отвечает на вопрос?   -  person James L    schedule 17.01.2014


Ответы (1)


Если вы хотите, чтобы @ внутри функции обратного вызова было таким же, как и снаружи, определите обратный вызов с помощью жирной стрелки (=>):

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

Имейте в виду, что @ (AKA this) внутри функции (Coffee|Java)Script зависит от того, как вызывается функция, а не от того, как или где функция определена (если, конечно, у вас нет связанной функции...). Если вы используете => для определения функции, то она будет привязана к текущим @, а @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(@)

если вы хотите родное решение.

person mu is too short    schedule 16.01.2014