2015-07-13 72 views
0

在我的角度应用$更新功能递延我更新任务如下

task.$update().then(function (task) { 
    // success 
}, function (response) { 
    // failure 
}); 

从后端我得到一个422回来,但第一个回调被调用。

我的资源看起来像这样

angular.module('App') 
    .factory('Task', function ($resource) { 
     var resource = $resource('/admin/tasks/:id', { id: '@id' }, { 
      new: { 
       method: 'GET', 
       url: '/admin/tasks/new' 
      }, 
      update: { 
       method: 'PUT' 
      }, 
      ... 
     }); 

    return resource; 
}); 

的问题是,在什么情况下被称为第二个回调?而且如果需要的话,我能在update方法做,使得第二回调叫什么名字?

UPDATE:之所以成功回调被调用所有的时间是因为一个错误拦截我

angular 
.module('App') 
    .factory('errorInterceptor', function ($location, $q, $rootScope) { 
     return { 
      responseError: function (response) { 
       if (response.config.url.match($location.$$host)) { 
        $rootScope.error = response; 

        return $q.reject(response); 
       } 

       return $q.when(response); 
      } 
     }; 
    }); 

很显然,如果你做return $q.when(response);你告诉角度说,一切都很好,对不对?

回答

1

的回调被指定为PARAMS到$更新()函数,就像这样:

$task.$update(function(task) {}, function(response) {}) 

$resource官方文档:

类对象或实例对象上的操作方法可以用以下参数调用 :

  • HTTP GET“class”操作:Resource.action([parameters],[success],[error])
  • 非GET“类”操作:Resource.action([parameters],postData,[success],[error])
  • 非GET实例动作:例如$行动([参数],[成功],[错误])

的事情是,不像$ HTTP,$更新或任何资源方法不返回直接承诺。他们返回一个空的参考。

注意$资源使用$http内部,因此$ HTTP文档应用(关于回调):

200和299之间的响应状态代码被认为是成功的状态,并会导致成功的回调之中调用。请注意,如果响应是重定向,XMLHttpRequest将会透明地遵循它,这意味着错误回调将不会被调用。

+0

我已经试过你的suggesion [这里](http://jsfiddle.net/3PUxx/78/)和它的作品。但在我的应用程序中,第一个回调仍然被调用。在我的应用程序的一个HTTP状态代码'422',它可以是它与此有关。凡德的文档中描述了它是如何决定哪个回调被调用?也许可以定义你自己的'$ update'功能? –

+0

我也发现了[这](http://stackoverflow.com/questions/18907117/angular-resource-not-invoking-my-error-callback-function)后,它使用拦截器来拒绝回应?! “4XX”响应真的需要吗? –

+0

$ resource使用$ http,因此$ http的文档适用: > 200到299之间的响应状态代码被视为成功状态,并且会导致调用成功回调。因此,任何> = 400(不重定向)都会触发错误回调。 如果您想要定义一个针对所有请求调用的回调函数,则只需要一个拦截器。拦截器将在$ resource方法中的回调定义之前运行。 –