2012-04-23 14 views
10

Estoy usando Iced coffescript con ups js cuando estoy refrescando varias fuentes de datos. El método de actualización tiene dos llamadas de respuesta una para el éxito y otra para el error, y quiero esperar a que cada llamada realice una devolución de llamada.Script de café helado con múltiples devoluciones de llamada

No puedo ver cómo hacer esto con el texto en off sin hacer una función adicional. Mi pregunta es: ¿hay una manera más elegante de que pueda diferir a una de múltiples devoluciones de llamada?

Este es el código que tengo actualmente:

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] 

Respuesta

5

Esta es la única manera que he encontrado para hacerlo también. Lo estoy usando en la espina dorsal y envolver (por ejemplo) la función @save de un modelo 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

Ésta es la manera que lo haría, aunque también es posible (pero más complicado) para asignar un nuevo Rendezvous, crear dos aplazamientos de ese Encuentro, y luego esperar a que solo los primeros vuelvan. –

1

Aquí hay un código que utilizo para convertir las promesas .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 

Puede modificar la función esc un poco para manejar múltiples argumentos para cada devolución de llamada.

0

iced.Rendezvous lib se hace explícitamente para este caso: devolver en la primera de varias devoluciones de llamada. De the docs:

Este es un ejemplo que muestra las diferentes entradas y salidas de una cita. La misma hace dos consultas de DNS paralelas, y los informes sólo cuando los primeros retornos:

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]}" 
Cuestiones relacionadas