拒绝在 angular $resource 的 $update 函数中延迟
Reject deferred in $update function of an angular $resource
在我的 angular 应用程序中,我按如下方式更新任务
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
方法中做什么来调用第二个回调?
更新:一直调用成功回调的原因是因为我有一个错误拦截器
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);
你告诉 angular 一切都很好,对吧?
回调被指定为 $update() 函数的参数,如下所示:
$task.$update(function(task) {}, function(response) {})
参见$resource的官方文档:
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])
问题在于,与 $http 不同,$update 或任何资源方法不直接 return 承诺。他们 return 一个空引用。
请注意,$resource 在内部使用 $http,因此适用 $http 文档(关于回调):
A response status code between 200 and 299 is considered a success status and will result in the success callback being called. Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning that the error callback will not be called for such responses.
在我的 angular 应用程序中,我按如下方式更新任务
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
方法中做什么来调用第二个回调?
更新:一直调用成功回调的原因是因为我有一个错误拦截器
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);
你告诉 angular 一切都很好,对吧?
回调被指定为 $update() 函数的参数,如下所示:
$task.$update(function(task) {}, function(response) {})
参见$resource的官方文档:
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])
问题在于,与 $http 不同,$update 或任何资源方法不直接 return 承诺。他们 return 一个空引用。
请注意,$resource 在内部使用 $http,因此适用 $http 文档(关于回调):
A response status code between 200 and 299 is considered a success status and will result in the success callback being called. Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning that the error callback will not be called for such responses.