2012-04-23 13 views
10

Uso il coffescript Iced con upshot j quando aggiorno più origini dati. Il metodo di aggiornamento prevede due richiami uno per il successo e uno per errore e desidero attendere che ogni chiamata effettui una richiamata.Script per caffè freddo con più callback

Non riesco a vedere come eseguire questa operazione con il coffescript identificato senza eseguire una funzione aggiuntiva. La mia domanda è: esiste un modo più elegante di poter rinviare a uno dei più callback?

Questo è il codice che ho attualmente:

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] 

risposta

5

questo è l'unico modo che ho trovato per farlo troppo. Lo sto usando in Backbone e avvolgere (per esempio) la funzione @save di un modello con un @icedSave:

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

Questo è il modo in cui lo farei, anche se è possibile (ma più complicato) per assegnare un nuovo Rendezvous, creare due differite da quel Rendezvous, e poi aspettare solo il primo a tornare. –

1

ecco qualche codice che utilizzo per la conversione Promises .then (-> onSuccess), (-> onError) a 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 

È possibile modificare leggermente la funzione esc per gestire più argomenti per ogni richiamata.

0

iced.Rendezvous lib è stato creato esplicitamente per questo caso: ritorno al primo di più callback. Da the docs:

Ecco un esempio che mostra i vari ingressi e le uscite di un Rendezvous. Lo fa due ricerche DNS parallele, e le relazioni solo quando le prime dichiarazioni:

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]}" 
Problemi correlati