【问题标题】:$http/$q/promise Questions (in Angular)$http/$q/promise 问题(在 Angular 中)
【发布时间】:2015-10-21 01:47:33
【问题描述】:

当 $q/$http 应该触发 onReject 块时,我似乎无法理解。

假设我有一个基本电话:

$http.get('/users')
  .then(function(res) {
    return res.data;
  }, function(err) {
    console.log(err);
  });

如果我得到500 Internal Server Error,我将最终进入onSuccess 块。根据我对承诺的微薄理解,我想这似乎是正确的,因为我在技术上确实得到了回应?问题是onSuccess 块似乎是错误的地方有一堆

if(res.status >= 400) {
  return $q.reject('something went wrong: ' + res.status);
}

只是为了让我的onReject 块运行。这是它应该工作的方式吗?大多数人是否在 onSuccess 块中处理 400 多个状态,或者他们是否返回拒绝的承诺以强制 onReject 块?我是否错过了更好的方法来处理这个问题?

我尝试在 httpInterceptor 中执行此操作,但我找不到从此处返回被拒绝承诺的方法。

this.responseError = function(res) {
  if(res.status >= 400) {
    // do something
  }

  return res;
};

【问题讨论】:

  • 如果有 400+ 错误代码,那么您的成功块将不会被命中。它会调用你的错误处理程序
  • 很可能你有一个httpInterceptor 代表responseError - 有一个拦截器意味着你“处理”了错误(除非你明确地return $q.reject),从而导致@987654336 的成功处理程序@
  • @NewDev 啊,就是这样,谢谢。我没有考虑在我的responseError 中执行return res 的含义以及这将如何返回一个新的、已解决的承诺而不是被拒绝的承诺。
  • 正确.. 完全正确。至于这个问题 - 也许最好删除它,因为问题的内容不包含问题的原因

标签: javascript angularjs promise angular-promise angular-http


【解决方案1】:

您可以在拦截器中而不是在回调中处理这些问题。

在您的 app.config 中,您可以将 $httpProvider 配置为如下内容:

$httpProvider.interceptors.push(['$q', function ($q) {
    return {
        request: function (config) {
            //do something 
            return config;
        },
        responseError: function (response) {
            if (response.status === 401) {
                //handle 401
            }
            return $q.reject(response);
        }
    };
}]);

【讨论】:

    【解决方案2】:

    你的成功障碍不会被击中。试试这个,如果错误代码 > 300,就会看到错误块。

    $http.get('/users').success(function(data, status, headers, config) {
        // this callback will be called asynchronously
        // when the response is available
      }).error(function(data, status, headers, config) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
      });
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多