Холодный кофе script с несколькими обратными вызовами
Я использую Iced coffescript с upshot js, когда я обновляю несколько источников данных. Метод обновления имеет два обратных вызова для успеха и один для ошибки, и я хочу дождаться, когда каждый вызов сделает обратный вызов.
Я не вижу, как это сделать с помощью незанятого 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]
Ответы
Ответ 1
Это единственный способ, которым я нашел это. Я использую его в 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)
Ответ 2
Вот код, который я использую для преобразования Promises .then (-> onSuccess), (-> onError)
в errbacks (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
, чтобы обрабатывать несколько аргументов для каждого обратного вызова.
Ответ 3
iced.Rendezvous lib явно указан для этого случая: return в первом из нескольких обратных вызовов. Из документы:
Вот пример, который показывает различные входы и выходы Рандеву. Он выполняет два параллельных поиска в 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]}"