Основываясь на вопросе здесь: jQuery цепочки и каскадирование тогда и когда и принятый ответ, я хочу разорвать цепочку обещаний в какой-то момент, но еще не нашел правильный путь. Есть несколько сообщений об этом, но я все еще потерян.
Взяв пример кода из исходного вопроса:
Menus.getCantinas().then(function(cantinas){ // 'then' is how we chain promises
Menus.cantinas = cantinas;
// if we need to aggregate more than one promise, we '$.when'
return $.when(Menus.getMeals(cantinas), Menus.getSides(cantinas));
}).then(function(meals, sides){ // in jQuery 'then' can take multiple arguments
Menus.sides = sides; // we can fill closure arguments here
Menus.meals = meals;
return Menus.getAdditives(meals, sides); // again we chain
}).then(function(additives){
Menus.additives = additives;
return Menus; // we can also return non promises and chain on them if we want
}).done(function(){ // done terminates a chain generally.
// edit HTML here
});
Как бы я разорвать цепь, если cantinas.length == 0
? Я не хотел бы получать ни еду, ни добавки, честно говоря, я хотел бы назвать какой-то "пустой результат" обратным вызовом. Я попробовал следующее, что очень некрасиво (но работает...). Научи меня правильному пути. Это все еще действительный результат, так что, по сути, это не "сбой", а пустой результат, я бы сказал.
var emptyResult = false;
Menus.getCantinas().then(function(cantinas){
Menus.cantinas = cantinas;
if (cantinas.length == 0) {
emptyResult = true;
return "emptyResult"; //unuglify me
}
return $.when(Menus.getMeals(cantinas), Menus.getSides(cantinas));
}).then(function(meals, sides){
if (meals == "emptyResult") return meals; //look at my ugliness...
Menus.sides = sides;
Menus.meals = meals;
return Menus.getAdditives(meals, sides);
}).then(function(additives){
if (additives == "emptyResult") return additives;
Menus.additives = additives;
return Menus;
}).done(function(){
if (emptyResult)
//do empty result stuff
else
// normal stuff
});