AngularJS service not invoking error callback on save() method

前端 未结 6 2086
伪装坚强ぢ
伪装坚强ぢ 2021-01-17 18:07

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 41

相关标签:
6条回答
  • 2021-01-17 18:34

    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.

    0 讨论(0)
  • 2021-01-17 18:36

    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.

    0 讨论(0)
  • 2021-01-17 18:37

    Actually if we follow the documentation. it works

     User.save(vm.user, function (response) {
                  FlashService.Success('Registration successful', true);
                  $location.path('/login');
          },
          function (response) {
    
              FlashService.Error(response.data);
              vm.dataLoading = false;
    
          });
    

    above is snip from my code it works.

    0 讨论(0)
  • 2021-01-17 18:39

    I'm copying from the ngResource documentation:

    The action methods on the class object or instance object can be invoked with the following parameters:

    • HTTP GET "class" actions: Resource.action([parameters], [success], [error])
    • non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
    • non-GET instance actions: instance.$action([parameters], [success], [error])

    Success callback is called with (value, responseHeaders) arguments. Error callback is called with (httpResponse) argument.

    $save is considered as a non-GET "class" action, so you must to use an extra postData parameter. Using the same question example, this should work:

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

    Keep an eye on the error callback, compared with the example, is calling with just one argument, which brings all the http response.

    0 讨论(0)
  • 2021-01-17 18:53

    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))
                    });
    
    0 讨论(0)
  • 2021-01-17 18:54

    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.

    0 讨论(0)
提交回复
热议问题