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

Есть два основных способа решения этой проблемы:

  1. Создайте разъем (как предложено 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
  1. Используйте библиотеку 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
Другие вопросы по тегам