2013-03-20 13 views
6

Mam problem z obietnicami jQuery 1.9.1, w których potencjalnie potrzebuję logiki warunkowej, która zwróci inną odroczoną i nie jestem pewien jak sobie z nią poradzić. To była moja najlepsza próba, ale ponieważ komentarze wskazują poniżej, kiedy trafiłem do innej gałęzi, wciąż trafiłem na drugą funkcję .then(), w której mam nadzieję, że mogę wrócić do użytkownika. Jakieś wzorce radzenia sobie z takim scenariuszem?Obsługa oddziałów z obietnicami

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

Ten wpis może pomóc: http://stackoverflow.com/questions/12149993/attempting-to-break-jquery-promise-chain-with-then-fail-and-reject – mattytommo

+0

[Ten post] (http: //net.tutsplus.com/tutorials/javascript-ajax/wrangle-async-tasks-with-jquery-promises/) pomoże ci lepiej zrozumieć obietnice. Zasadniczo, jeśli chcesz używać warunków warunkowych, powinieneś oszczędzać obietnicę jako zmienną i wykonywać '' ów' 'sukces' lub' fail' w swoich warunkach, wydaje się, że robisz to na odwrót. – acconrad

Odpowiedz

4

To staje się łatwiejsze, uznając, że jest wykonywany bezwarunkowo options.onSuccess(rc); w drugim .then() ale nie w pierwszym.

Tak więc pierwszy .then() musi przejść na rc albo:

  • jeśli rc === 0, w odpowiedzi na storage.write(c) ukończenie
  • lub natychmiast, jeśli rc !== 0.

.then() jest naprawdę przydatne do tego, ponieważ pozwala to naturalnie albo wartość nowego obiecują być zwrócone z jego done zwrotnego.

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() 
}); 

Jestem pewien, że istnieją inne podejścia, ale jest to najbliższy mojemu oryginalnemu pomysłowi.

Byłoby miło, aby nie trzeba tworzyć nowego odroczony gdy rc === 0 ale jest to najbardziej realistyczne podejście do przekazywania rc, unikając konieczności modyfikowania storage.write() zachowywać się w ten sposób.

Powiązane problemy