Как использовать IcedCoffeeScript в функции с двумя обратными вызовами?
Давайте предположим, что у меня есть такая функция (в Javascript):
Fun Fun(success_cb, error_cb) { Var результат; пытаться { результат = function_that_calculates_result(); success_cb(результат); } catch (e) { error_cb(е); } }
И я использую это как:
fun (функция (результат) { console.log(результат); }, функция (ошибка) { console.log(Error.message); });
Как я могу переписать использование этой функции в IcedCoffeeScript с await
а также defer
?
2 ответа
Из https://github.com/maxtaco/coffee-script/issues/120:
Есть два основных способа решения этой проблемы:
- Создайте разъем (как предложено maxtaco):
converter = (cb) -> cb_success = (args...) -> cb null, args... cb_error = (err) -> cb err return [cb_error, cb_success] await getThing thing_id, converter(defer(err,res))... console.log err console.log res
- Используйте библиотеку iced.Rendezvous (пример кода из node-awaitajax):
settings.success = rv.id('success').defer data, statusText, xhr settings.error = rv.id('error').defer xhr, statusText, error xhr = najax settings await rv.wait defer status switch status when 'success' then defersuccess data, statusText, xhr when 'error' then defererror xhr, statusText, error
Я не думаю, что есть оптимальный способ сделать это в сценарии со льдом кофе, хотя в этом посте есть несколько интересных советов: сценарий со льдом кофе с несколькими обратными вызовами
Я бы просто придерживался сценария ванильного кофе:
Вот как ваша функция будет написана в кофе-скрипте
fun = (success_cb, error_cb) ->
try
result = function_that_calculates_result()
success_cb result
catch e
error_cb e
и как бы вы назвали это в сценарии кофе
fun (result) ->
console.log result
, (error) ->
console.log error.message
Если вы можете переписать забавную функцию в стиле "errback" (err, result) в сценарии кофе, это будет:
fun = (callback) ->
try
result = function_that_calculates_result()
callback null, result
catch e
callback e
Затем вы будете использовать это в ледяной кофе
await fun defer error, result
if error
console.log error.message
else
console.log result