Как использовать ScopedClient с Iced CoffeeScript

Я пытаюсь переписать скрипт hubot, используя скрипт со льдом кофе. Вот мой оригинальный обычный (горячий?) Код CoffeeScript:

getHost = (msg, artifact, cb) ->
  url = "http://myapi.org/api/hosts-for/artifact/#{artifact}"
  msg.http(url)
    .get() (err, res, body) ->
      cb(body)

Обратите внимание, что msg.http() выполняет вызов http-клиента Scoped, который вы можете найти здесь: https://github.com/technoweenie/node-scoped-http-client

Я хотел бы превратить это в функцию, которая не использует обратный вызов, но ждет ответа API и возвращает его. Вот моя попытка преобразовать вышеупомянутое в ICS:

getHostAwait = (msg, artifact) ->
  url = "http://myapi.org/api/hosts-for/artifact/#{artifact}"
  await msg.http(url)
    .get() (err, res, body) ->
      defer(body)
  body

Тем не менее, тело не возвращается (оно не определено). Как я могу заставить этот код работать?

2 ответа

Вы можете попробовать это:

getHostAwait = (msg, artifact) ->
  url = "http://myapi.org/api/hosts-for/artifact/#{artifact}"
  await msg.http(url)
    .get(), defer err, res, body
  yourCallBack body

Потому что ваш код асинхронный. К тому времени, когда это "тело" возвращается к вызывающей стороне, оно еще не инициализировано или не назначено. Вы можете попробовать отправить дескриптор в качестве третьего аргумента для асинхронного запуска. Например, вместо того, чтобы возвращать boby, отправьте функцию myFunction, которая может быть выполнена асинхронно.

getHostAwait = (msg, artifact, myFunction) ->
  url = "http://myapi.org/api/hosts-for/artifact/#{artifact}"
  await msg.http(url)
    .get() (err, res, body) ->
      myFunction(body)
Другие вопросы по тегам