MonkeyBonkey
MonkeyBonkey

Reputation: 47871

how to throw an error in a $http promise

I have an angular service that wraps my rest api calls and returns a $http promise.

My question is how do I throw an error so that a promise that triggers the .error method gets called? I don't want to just throw error since I want it to use the .success/.error in the calling function rather than doing a try catch block around it.

myFunction: function(foo)
   if (foo) {
      return $http.put(rootUrl + '/bar', {foo: foo});
   }
   else {
      //what do I return here to trigger the .error promise in the calling function
   }

Upvotes: 5

Views: 8149

Answers (4)

Malik Waqas
Malik Waqas

Reputation: 1

You can raise or throw a custom error using throw new Error ("custom error").

For http:

http.get('url').toPromise().then (result =>{
  throw new Error ("My Custom Error") // New Custom error  New is optional w
}).catch(err => {
  throw  err
}); // catch will catch any error occur while http call 

Upvotes: 0

Anton Bessonov
Anton Bessonov

Reputation: 9813

You don't need $q.defer(). And else too. You can use reject directly:

myFunction: function(foo) {
    if (foo) {
        return $http.put(rootUrl + '/bar', {foo: foo});
    }

    return $q.reject("reject reason");
}

See https://docs.angularjs.org/api/ng/service/$q#reject

Upvotes: 6

Gustav
Gustav

Reputation: 3576

First inject the $q-service in your service. Then in your else:

else {
     var deferred = $q.defer();
     deferred.reject("reject reason, foo was false");
     return deferred.promise;
}

Not as clever as Blazemonger's, but its quick to do.

Upvotes: 0

Blazemonger
Blazemonger

Reputation: 92893

You'll want to create your own promise using $q. Here's how I did something similar in a recent project:

app.service('allData', ['$http','$q',function($http,$q) {
    return {
        getJson: function() {
            return $q(function(resolve, reject) { // return a promise
                $http.get('/path/to/data.json', {cache:true})
                    .success(function(data) {
                        if (angular.isArray(data)) { // should be an ordered array
                        // or any other test you like that proves it's valid
                            resolve(data);
                        } else {
                            reject("Invalid JSON returned");
                            console.log(data);
                        };
                    })
                    .error(function(data) {
                        reject("Invalid data returned");
                        console.log(data);
                    });
            });
        }
    };
}]);

And in my controller:

allData.getJson().then(function(json) {
    // success, do something with the json
}, function(reason) { // failure, .getJson() had some kind of error
    alert('Sorry, unable to retrieve data from the server.')
    console.error(reason);
});

Upvotes: 1

Related Questions