2013-03-20 1 views
6

У меня проблема с обещаниями jQuery 1.9.1, где мне потенциально нужна условная логика, которая вернет другую отложенную, и я не уверен, как ее обрабатывать. Это была моя лучшая попытка, но, как видно из комментариев, когда я попал в ветку else, я все равно ударяю вторую функцию .then(), где я надеюсь, что смогу вернуться к пользователю. Любые шаблоны для обработки такого сценария?Работа с ветвями с обещаниями

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

Это сообщение может вам помочь: http://stackoverflow.com/questions/12149993/attempting-to-break-jquery-promise-chain-with-then-fail-and-reject – mattytommo

+0

[This post] (http: //net.tutsplus.com/tutorials/javascript-ajax/wrangle-async-tasks-with-jquery-promises/) поможет вам лучше понять обещания. В общем случае, если вы хотите использовать условные выражения, вы должны сэкономить обещание как переменную и выполнить «' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – acconrad

ответ

4

Это становится легче, принимая мнение, что options.onSuccess(rc); выполняется безоговорочно во втором .then(), но никогда не в первую очередь.

Таким образом, первый .then() должен передать rc либо:

  • если rc === 0, в ответ на storage.write(c) завершения
  • или немедленно, если rc !== 0.

.then() очень удобен для этого, потому что, естественно, позволяет либо значение нового Promise будет возвращено из своего done обратного вызова.

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

Я уверен, что существуют другие подходы, но это самое близкое, что я могу придумать для вашей первоначальной концепции.

Было бы хорошо, чтобы не иметь, чтобы создать новый Отложенный когда rc === 0 но это самый реалистичный подход к прохождению на rc, что избавляет от необходимости изменять storage.write() вести себя таким образом.