Taylorsuk
Taylorsuk

Reputation: 1449

Catching errors at the end of a chain of promises

I am using a factory to query data from Parse.com, this occurs many times in my ionic app and would like to apply a little more DRY to my code.

To call data I am using:

ParseFactory.provider('Clients', query).getAll().success(function(data) {
    $localStorage.Clients = data.results;
}).error(function(response) {
    errorFactory.checkError(response);
});

And often run many of these back to back to get data from different classes on the loading of a page.

Is it possible to use one error block at the end of all of these? like this:

ParseFactory.provider('Favourites', query).getAll().success(function(data) {
    $localStorage.Favourites = data.results;
})
ParseFactory.provider('Somethings/', query).getAll().success(function(data) {
    $localStorage.Programmes = data.results;
})
ParseFactory.provider('UserItems', query).getAll().success(function(data) {
    $localStorage.UserExercises = data.results;
})
ParseFactory.provider('Customers', query).getAll().success(function(data) {
    $localStorage.Clients = data.results;
}).error(function(response) {
    errorFactory.checkError(response);
}); 

Upvotes: 0

Views: 36

Answers (2)

Erti-Chris Eelmaa
Erti-Chris Eelmaa

Reputation: 26268

You could create helper method:

function query(resource, query) {
  function querySucceeded(data) {
    $localStorage[resource] = data.results;
  }

  function queryFailed() {}

  ParseFactory.provider(resource,  query)
     .getAll()
     .success(querySucceeded)
     .error(queryFailed);
}

and, then just call:

query('Favourites', query);
query('Customers', query);

and so on.

Alternatively, you could factor queryFailed out, as such:

function query(resource, query) {
  function querySucceeded(data) {
    $localStorage[resource] = data.results;
  }

  return ParseFactory.provider(resource,  query)
     .getAll()
     .success(querySucceeded);
}

function queryFailed() {


}

$q.all([
    query('Favourites', query1),
    query('UserItems', query2)])
    .error(queryFailed);

Upvotes: 1

JB Nizet
JB Nizet

Reputation: 691645

$q.all takes an array (or object) of promises, and returns a single one.

The returned promise is resolved when all the original promises are resolved. It's rejected as soon as one of the original promises is rejected.

So, what you can simply do is something like

var request = function(path) {
    return ParseFactory.provider(path, query).getAll();
};

var promises = {
    favourites: request('Favourites'),
    programmes: request('Somethings/'),
    exercises: request('UserItems'),
    customers: request('Customers')
};
$q.all(promises).then(function(results) {
    $localStorage.Favourites = results.favourites.data.results;
    // ...
}).catch(function() {
    // ...
});

Upvotes: 1

Related Questions