2013-08-22 2 views
0

Я пытаюсь переписать сценарий hubot, используя сценарий со льдом кофе. Вот мой оригинальный регулярный (горячий?) CoffeeScript код:Как использовать ScopedClient с Iced 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-клиент контекстного который вы можете найти здесь: 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 

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

ответ

0

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

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

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

getHostAwait = (msg, artifact) -> 
    url = "http://myapi.org/api/hosts-for/artifact/#{artifact}" 
    await msg.http(url) 
    .get(), defer err, res, body 
    yourCallBack body 
Смежные вопросы