Wie bricht man richtig aus einer Versprechenskette aus?

Basierend auf die Frage hier:jQuery Verkettung und Kaskadierung dann und wann ist und die akzeptierte Antwort.

Ich möchte die Versprechen-Kette an einem Punkt brechen, habe aber noch nicht den richtigen Weg gefunden. Es gibtmehrer posts Übe das, aber ich bin immer noch verloren.

Nehmen Sie den Beispielcode aus der ursprünglichen Frage:

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

Wie würde ich die Kette brechen, wenncantinas.length == 0? Ich würde weder die Mahlzeiten noch die Zusatzstoffe bekommen wollen, ehrlich gesagt würde ich eine Art "leeres Ergebnis" -Rückruf nennen wollen. Ich habe folgendes probiert was @ isehr hässlic (funktioniert aber ...). Lehre mich den richtigen Weg. Dies ist immer noch ein gültiges Ergebnis, also kein "Fehlschlag" an sich, nur ein leeres Ergebnis, würde ich sagen.

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage