【问题标题】:in $http how to conditionally transform a response so that error path is taken在 $http 如何有条件地转换响应以便采用错误路径
【发布时间】:2015-06-19 01:38:40
【问题描述】:

我有一个服务器 api,它返回一个像 {status: ok/error, errtext: ..., payload: ...} 这样的 json 字符串。当status !== 'ok'我希望我的程序采取错误处理方法,相当于$q.reject。我正在使用 http 转换来协调我的一些数据结构。

我的代码:

var p = $http({
            url: url,
            timeout: cancel.cancel,
            method: 'GET',
            headers: addl_headers,
            transformResponse: _appendTransform($http.defaults.transformResponse, function (data, headers, status) {
                return _doTransform(data, headers, status);
            })
        });
p.then(function(goodrespObj){...}, function(badnessObj){...});

    function _appendTransform(defaults, transform) {
        defaults = angular.isArray(defaults) ? defaults : [defaults];
        return defaults.concat(transform);
    }
    function _doTransform(data, headers, status) {
        if (data.status !== 'OK') {
            console.error("bad errtext", data.status, "$http status", status);
            (X) ????? something smart that will trigger HTTP ERROR path ?????
        }
        // ...
        return f(data); // this is received as "goodrespObj.data" above
    }

如果在标记为 (X) 的点上,如果我返回错误文本,它会逐字返回“良好”功能。如何指示服务器错误,或以某种方式导致transformResponse 中的$q.reject(resp) 路径?

查看transformResponse()的代码我可以看到用户功能无法触摸response.status所以还有其他方法吗?

我正在使用带有离子框架的角度。

编辑:删除了我之前的评论 - 查看接受的答案。

【问题讨论】:

  • 您是否考虑过添加响应拦截器?您应该能够检查所有响应中的 JSON,并在它们到达您的控制器之前将它们变成拒绝。在这里查看接受的答案:stackoverflow.com/questions/11956827/…

标签: angularjs ionic-framework


【解决方案1】:

transformResponse 通常用于将响应从另一种格式(或类似目的)转换。

你要找的是intercept

$httpProvider.interceptors.push(function($q) {
  return { 
    'response': function(response) {
       if (isBad(response)) {
           return $q.reject(rejectionReason(response));
       }
    }
  };
});

【讨论】:

  • 我经常想做类似的事情,但最终将 http 和服务器错误与逻辑错误分开处理。这种方法是正常的做法吗?
  • 是的。 HTTP 错误可能是由错误的请求、错误的连接、过期的会话、关闭服务器等引起的。您应该正确处理它们并向用户显示一些信息以便稍后重试(您也可以在代码中重试)。逻辑错误是由开发人员引起的,是代码中的错误。他们应该快速失败,抛出错误,以便您立即注意到并修复它。 PS:这与上下文有些无关,如果您要创建一个新问题来问这个更好。
  • @UmurKontacı 但我必须做一个throw,而不是$q.reject。有了reject,它仍然会采用良好的响应路径。
  • @Dinesh 你不需要扔,你需要返回$q.reject的结果。 (我确实更新了代码示例)
  • @UmurKontacı 谢谢!!我还发现 $q.reject 调用参数成为错误处理程序的参数,所以我需要做类似的事情,例如{response.statusText = 'bad!'; return $q.reject(response);}
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2014-04-27
  • 2023-03-07
  • 2019-07-28
  • 2019-04-14
  • 2019-06-11
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多