截取$ resource和$ http响应的角度

时间:2013-12-11 12:31:43

标签: javascript angularjs

我有一个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

2 个答案:

答案 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期望
  • 的方式
  • 根据this answer中的建议,推出基于$resource构建的$http版{{1}},其工作方式符合您的要求。