Как использовать 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)