Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS service not invoking error callback on save() method

So I'm using angularjs restful service $resource and I'm calling $save function. However, the error callback I pass to it is not being called. The server is sending a 418 error which I thought since it's NOT 200 would result in the error callback being invoked. But, it never does. I can't find any documentation stating what http error codes will result in the error callback being called.

Here is my code:

var modalScope = $scope.$new();
modalScope.showPassword = false;
modalScope.message = null;
modalScope.user = new User();

modalScope.submit = function(user) {
    user.$save( {}, function(data,headers) {
        // do the success case
    }, function(data,headers) {
        // do the error case                
    });
};

The modalScope.user is being passed to the submit function defined. So what's the problem why this error callback isn't being called?

like image 883
chubbsondubs Avatar asked Oct 26 '12 04:10

chubbsondubs


4 Answers

I found the following in the ngResource source code

$http({method: 'GET', url: '/someUrl'}).
    success(function(data, status, headers, config) {
        // this callback will be called asynchronously
        // when the response is available
    }).
    error(function(data, status, headers, config) {
        // called asynchronously if an error occurs
        // or server returns response with status
        // code outside of the <200, 400) range
    });

I am kind of confused about the range notation but it seems it should actually call the error method. Maybe you found a bug.

like image 161
F Lekschas Avatar answered Nov 17 '22 01:11

F Lekschas


Had the same problem and nothing here worked. Turned out I had an custom debug-interceptor that didn't explicitly return a $q.reject(response).

Apparently every custom debug-interceptor completely overwrites the default behavior.

See https://github.com/angular/angular.js/issues/2609#issuecomment-44452795 for where I found the answer.

like image 45
Ruud van der Linden Avatar answered Nov 17 '22 00:11

Ruud van der Linden


I had troubles with the error callback as well, but it appears that in more recent versions of AngularJS, the error callback method must now be implemented something like this:

SomeResource.query({}, angular.noop, function(response){
  $scope.status = response.status; 
});

Source + more detailed description: https://groups.google.com/d/msg/angular/3Q-Ip95GViI/at8cF5LsMHwJ

Also, in response to the comments on Flek's post, it seems that now only responses between 200 and 300 are not considered an error.

like image 29
sgdesmet Avatar answered Nov 17 '22 01:11

sgdesmet


I couldn't get Alter's answer to work, but this worked for me:

user.$save(function (user, headers) {
                    // Success
                    console.log("$save success " + JSON.stringify(user));
                }, function (error) {
                    // failure
                    console.log("$save failed " + JSON.stringify(error))
                });
like image 2
mstreffo Avatar answered Nov 16 '22 23:11

mstreffo