I currently have a humongous if-then-else loop in front of me which first gets multiple cantinas from a webservice. Then it gets all available meals (for each menu) and all available side dishes (for each menu). For each of the meals as well as the sides it then checks for all additives and aggregates them.
In the end I have multiple menus with meals, side dishes and all their additives.
The following flowchart shows the process:
I want to beautify the code and want to make use of promises with jQuery - but I can't figure out how to do it as I have to stack a then
after a when
(at least I think, maybe I have to resolve
?). The following is my best try:
//this totally does not work at all, but you get the idea what I want to do
Menus.getCantinas()
.when(Menus.getMeals(cantinas), Menus.getSides(cantinas)) //when doesn't exist here, neither does cantinas
.then(Menus.getAdditives(meals, sides) //also throws errors as meals and sides does not exist
.done(function(cantinas, meals, sides, additives) { //more errors for the people
Menus.cantinas = cantinas;
Menus.meals = meals;
Menus.sides = sides;
Menus.additives = additives;
//... some html stuff to build the menus
});
Make sure to check out the following code snippet for more explanatory code.
window.Menus = {
cantinas = {},
meals = {},
sides = {},
additives = {},
callWebservice: function (listname, filter)
{
if (filter && filter != '')
data['$filter'] = filter;
return jQuery.ajax({
url: '/_api/web/lists/getbytitle(\'' + listname + '\')/items',
data: data,
dataType: 'json'
});
},
getCantinas: function() {
return Menus.callWebservice("Cantinas", "");
},
getMeals: function(cantinas) {
var filterString;
for (var i = 0; i < cantinas.length; i++) {
if (i == 0) {
filterstring = "ID eq " + cantinas[i];
}
else {
filterstring += " or ID eq " + cantinas[i]
}
}
return Menus.callWebservice("Meals", filterString);
},
getSides: function(cantinas) {
//see above function for filterstuff
return Menus.callWebservice("Sides", filterString);
},
getAdditives: function(meals, sides) {
for (var i = 0; i < meals.length; i++) {
if (i == 0 && !meals) {
filterstring = "ID eq " + meals[i];
}
else {
filterstring += " or ID eq " + meals[i]
}
}
for (var i = 0; i < sides.length; i++) {
if (i == 0 && !sides) {
filterstring = "ID eq " + sides[i];
}
else {
filterstring += " or ID eq " + sides[i]
}
}
return Menus.callWebservice("Additives", "");
}
Init: function() {
//this totally does not work at all, but you get the idea what I want to do
Menus.getCantinas()
.when(Menus.getMeals(cantinas), Menus.getSides(cantinas))
.then(Menus.getAdditives(meals, sides)
.done(function(cantinas, meals, sides, additives){
Menus.cantinas = cantinas;
Menus.meals = meals;
Menus.sides = sides;
Menus.additives = additives;
//... some html stuff to build the menus
});
}
}
Menus.Init()
I hope I am making sense? How to make use of promises and cascade parameters from one to the next and basically how to make the above statement work and get me my multiple menus with multiple meals, sides and additives.
Like the comments said
$.when
is a free function. If we usethen
able chaining we can get pretty clean syntax here.