Immediately return a resolved promise using AngularJS

Issue

I’m trying to get my head around promises in JavaScript (in particular AngularJS).

I have a function in a service, let’s call it fooService, that checks if we’ve loaded some data. If it has, I just want it to return, and if we haven’t, we need to load the data and return a promise:

this.update = function(data_loaded) {
    if (data_loaded) return;  // We've loaded the data, no need to update

    var promise = Restangular.all('someBase').customGet('foo/bar').then(function(data) {
        // Do something with the data here
    }

    return promise;
}

I have another function that then calls the update function of fooService like so:

fooService.update(data_loaded).then(function() {
    // Do something here when update is finished
})

My issue here is that if we don’t need to load the data in the update function, a promise isn’t returned, so the .then() is not called in my other function. What should the approach be here – basically I want to return a resolved promise immediately from the update() function if we do not need to get data from the Restangular call?

Solution

The current accepted answer is overly complicated, and abuses the deferred anti pattern. Here is a simpler approach:

this.update = function(data_loaded) {
    if (data_loaded) return $q.when(data);  // We've loaded the data, no need to update

    return Restangular.all('someBase').customGet('foo/bar')
                             .then(function(data) {
        // Do something with the data here 
    });
};

Or, even further:

this._updatep = null;
this.update = function(data_loaded) { // cached
    this._updatep = this._updatep || Restangular.all('someBase') // process in
                                                .customGet('foo/bar'); //.then(..
    return this._updatep;
};

Answered By – Benjamin Gruenbaum

Answer Checked By – Katrina (AngularFixing Volunteer)

Leave a Reply

Your email address will not be published.