Can You Resolve An Angularjs Promise Before You Return It?


Answer :

Short answer: Yes, you can resolve an AngularJS promise before you return it, and it will behave as you'd expect.

From JB Nizet's Plunkr but refactored to work within the context of what was originally asked (i.e. a function call to service) and actually on site.

Inside the service...

function getSomething(id) {     // There will always be a promise so always declare it.     var deferred = $q.defer();     if (Cache[id]) {         // Resolve the deferred $q object before returning the promise         deferred.resolve(Cache[id]);          return deferred.promise;     }      // else- not in cache      $http.get('/someUrl', {id:id}).success(function(data){         // Store your data or what ever....          // Then resolve         deferred.resolve(data);                    }).error(function(data, status, headers, config) {         deferred.reject("Error: request returned status " + status);      });     return deferred.promise;  } 

Inside the controller....

somethingService.getSomething(5).then(         function(thing) {     // On success         alert(thing);     },     function(message) {   // On failure         alert(message);     } ); 

I hope it helps someone. I didn't find the other answers very clear.


How to simply return a pre-resolved promise in Angular 1.x

Resolved promise:

return $q.when( someValue );    // angular 1.2+ return $q.resolve( someValue ); // angular 1.4+, alias to `when` to match ES6 

Rejected promise:

return $q.reject( someValue ); 

Here's how I typically do it if I want to actually cache data in array or object

app.factory('DataService', function($q, $http) {   var cache = {};   var service= {            getData: function(id, callback) {       var deffered = $q.defer();       if (cache[id]) {                  deffered.resolve(cache[id])       } else {                     $http.get('data.json').then(function(res) {           cache[id] = res.data;                         deffered.resolve(cache[id])         })       }       return deffered.promise.then(callback)     }   }    return service  }) 

DEMO


Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable