2013-03-20 23 views
6

Ho un problema con jQuery 1.9.1 promesse, in cui potenzialmente ho bisogno di una logica condizionale che restituirà un altro rinviato e non sono sicuro di come gestirlo. Questo è stato il mio miglior tentativo, ma come i commenti indicano di seguito, quando premo il ramo else, colgo comunque la seconda funzione .then(), dove spero di poter tornare all'utente. Qualche modello per come gestire un tale scenario?Gestione di filiali con Promises

storage.provision(c) 

.then(function(rc){ 
    if(rc === 0){ 
     storage.write(c); 
    }else{ 
     return options.onSuccess(rc); //how i got back to the users callbacks/promise, but this 
     //takes me to the .then below 
    } 
}) 
//storage.write returns a promise as well, do I do another .then 
// like this? 
.then(function(rc){ 
    //I was hoping this would catch, the storage.write() case, and it does, but it also catches 
    //the retun options.onSuccess(rc) in the else case. 
    options.onSuccess(rc); 
}) 


.fail(function(e){ 
    //handle error using .reject() 
}); 
+0

Questo post potrebbe aiutarti: http://stackoverflow.com/questions/12149993/attempting-to-break-jquery-promise-chain-with-then-fail-and-reject – mattytommo

+0

[questo post] (http: //net.tutsplus.com/tutorials/javascript-ajax/wrangle-async-tasks-with-jquery-promises/) ti aiuterà a capire meglio le promesse. In generale, se vuoi usare i condizionali dovresti salvare la promessa come variabile ed eseguire il tuo 'success'' o' fallire' nei tuoi condizionali, sembra che tu stia facendo il contrario. – acconrad

risposta

4

questo diventa più facile ritenendo che options.onSuccess(rc); viene eseguito incondizionatamente nella seconda .then() ma mai nel primo.

Così, il primo .then() deve trasmettere rc uno:

  • se rc === 0, in risposta a storage.write(c) Completando
  • o immediatamente se rc !== 0.

.then() è davvero a portata di mano per questo perché permette naturalmente un valore di una nuova promessa di essere tornato dal suo done callback.

storage.provision(c).then(function(rc) { 
    if(rc === 0) { 
     var dfrd = $.Deferred(); 
     storage.write(c).done(function() { 
      dfrd.resolve(rc); 
     }).fail(dfrd.fail); 
     return dfrd.promise(); 
    } else { 
     return rc;//pass on rc to the second .then() 
    } 
}).then(function(rc){ 
    options.onSuccess(rc); 
}).fail(function(e){ 
    //handle error using .reject() 
}); 

Sono sicuro che esistono altri approcci, ma questo è il più vicino che riesco a pensare al tuo concetto originale.

Sarebbe bello non dover creare un nuovo differite nel caso in rc === 0 ma è l'approccio più realistico per trasmettere rc, evitando la necessità di modificare storage.write() a comportarsi in questo modo.