Сценарий кофе со льдом с несколькими обратными вызовами

Я использую Iced coffescript с upshot js, когда обновляю несколько источников данных. У метода обновления есть два обратных вызова, один для успеха и один для ошибки, и я хочу дождаться каждого вызова, чтобы сделать любой обратный вызов.

Я не вижу, как это сделать с помощью idced coffescript, не выполняя дополнительную функцию. У меня вопрос - есть ли более элегантный способ, которым я могу отложить один из нескольких обратных вызовов?

Это код, который у меня есть в настоящее время:

refreshMe = (key, value, result) =>
    value.refresh(
    (success)=>
            result success
    ,
    (fail, reason, error)=>
        result undefined, fail
    )
@refresh = () =>                
success={}
fail={}
await
    for key, value of @dataSources
    refreshMe key, value, defer success[key], fail[key]

3 ответа

Решение

Это единственный способ, который я нашел, чтобы сделать это тоже. Я использую его в Backbone и обертываю (например) функцию модели @save с помощью @icedSave:

# An IcedCoffeescript friendly version of save
icedSave: (callback) ->
    @save {},
        success: (model, response) -> callback(true, model, response)
        error: (model, response) -> callback(false, model, response)

Вот код, который я использую для конвертации Обещаний .then (-> onSuccess), (-> onError) ошибаться (err, result) ->:

# You can write like this:
await value.refresh esc defer e, result


# onError - function to be called when promise rejected.
# onSuccess - function to be called when promise is fulfilled.
module.exports = esc = (onError, onSuccess) ->
  util = require 'util'
  return (result) ->
    if util.isError result
      # Always send back an error to first handler.
      onError? result
    else if onSuccess?
      console.log onSuccess, result
      # `await fn esc done, defer result`
      onSuccess? result
    else
      # `await fn esc done`
      onError? null, result

Вы можете изменить esc Функция немного для обработки нескольких аргументов для каждого обратного вызова.

libed.Rendezvous lib создается явно для этого случая: возврат при первом из нескольких обратных вызовов. Из документов:

Вот пример, который демонстрирует различные входы и выходы рандеву. Он выполняет два параллельных поиска DNS и сообщает только при первом возвращении:

hosts = [ "okcupid.com", "google.com" ];
ips = errs = []
rv = new iced.Rendezvous
for h,i in hosts
    dns.resolve hosts[i], rv.id(i).defer errs[i], ips[i]

await rv.wait defer which
console.log "#{hosts[which]}  -> #{ips[which]}"
Другие вопросы по тегам