我有一个json回复:
{
"success": false,
"error": "Server says no.",
"data": []
}
包裹在$resource
中,如下所示:
$resource("path-to-file.json", null, {
query: {
method: "GET",
isArray: false,
responseType: "json",
interceptor: {
response: function (response) {
if (!response.data.success) {
// stop propagation of events/promises and trigger error
}
// do something else with response.data
return response;
}
}
}
});
如果"success": false
我想触发$http
的错误功能。
我想这样做:
$scope.myVar = MyService.query(); // MyService returns $resource
在控制器中。无论我尝试做什么,响应都会传递给$scope.myVar
。
答案 0 :(得分:1)
尝试
if (!response.data.success) {
return $q.reject(rejection);
}
看看这是否调用错误回调。我是从$http
http://docs.angularjs.org/api/ng。$ http
答案 1 :(得分:1)
值得记住的是:
ngResource模块为RESTful服务1
提供交互支持
当他们说“RESTful服务”时,他们意味着他们会对端点的行为方式做出一些假设。其中一个假设是成功或错误状态将由HTTP状态代码编码。
听起来您正在尝试与不符合此模式的服务进行交互(即您可能会有一个返回200: OK
的失败请求)。如果是这种情况,您可能最好直接使用$http
,因为它更通用:
$ http服务是一项核心Angular服务,可促进与远程HTTP服务器的通信2
由于$resource
实际上只是$http
的封套,我们可以通过查看the source(为清晰起见而编辑)来相当轻松地确认行为:
var promise = $http(httpConfig).then(function(response) {
var data = response.data,
promise = value.$promise;
// snip
value.$resolved = true;
response.resource = value;
return response;
}, function(response) {
value.$resolved = true;
(error||noop)(response);
return $q.reject(response);
});
promise = promise.then(
function(response) {
var value = responseInterceptor(response);
(success||noop)(value, response.headers);
return value;
},
responseErrorInterceptor);
请记住,then()
按顺序取得成功和错误回调。你可以看到你的拦截器将成功调用,如果有的话,还会有主要的成功回调。
看起来你responseInterceptor
内部没有任何可以导致错误回调被执行的事情。
我认为你的选择是:
$resource
期望$resource
构建的$http
版{{1}},其工作方式符合您的要求。