Learn how to manually control how asynchronous requests are handled with the use of promises. Because $http is built to work with promises, we saw a foreshadow of them in the previous lesson. We will take this a step further but seeing how to manually create a promise and then resolve or reject it as we see fit.
angular.module('eggly.models.categories', [ ])
.service('CategoriesModel', function ($http, $q) {
var CategoriesModel = {},
URLS = {
FETCH: 'data/categories.json'
},
categories; function extract(result) {
return result.data;
} function cacheCategories(result) {
categories = extract(result);
return categories;
} CategoriesModel.getCategories = function() {
return (categories) ? $q.when(categories) : $http.get(URLS.FETCH).then(cacheCategories);
}; CategoriesModel.getCategoryByName = function(categoryName) { function findCategory(){
return _.find(categories, function(c){
return c.name == categoryName;
})
} return $q(function(resolve, reject) {
//resolve it when categories are set
if(categories){
resolve(findCategory());
}else{
//if not set, get the categories
CategoriesModel.getCategories()
.then(function() {
resolve(findCategory());
})
}
})
}; return CategoriesModel;
})
;