如何使用$ http区分已取消的请求

时间:2017-04-18 09:56:28

标签: javascript angularjs angular-http

$http错误处理程序中,我需要区分真正的HTTP错误和已取消的请求。

以下是一个例子:

app.controller('Ctrl', function ($http, $q) {
    const vm = this;
  this.errors = [];

  vm.errorHandler = (label) => ((error) => {
    this.errors.push(label + ' : \n\n' + JSON.stringify(error, null, 2));
  });


  vm.unResolved = () => {
    $http({
      method: 'GET',
      url : 'https://Idonotexist'
    }).catch(vm.errorHandler('unResolved'));
  }

  vm.cancelled = () => {
  const canceller = $q.defer()
    $http({
      method: 'GET',
      timeout: canceller.promise,
      url : 'https://www.googleapis.com/books/v1/volumes?q=isbn:0747532699'
    }).catch(vm.errorHandler('cancelled'));
    canceller.resolve();
  }

  vm.unsecured = () => {
    $http({
      method: 'GET',
      url : 'http://Idonotexist'
    }).catch(vm.errorHandler('unsecured'))
  }
});

在我的errorHandler功能中,我想区分已取消的请求和真正的错误(例如“不安全”或“未解析的主机”)。

将取消者传递给错误处理程序将是一件非常痛苦的事情,如果没有angularjs取消器,它将无法正确处理浏览器取消的请求。

到目前为止,这是我在错误处理程序中遇到的错误。

未取消(主机未解决)请求出错:

{
  "data": null,
  "status": -1,
  "config": {
    "method": "GET",
    "transformRequest": [
      null
    ],
    "transformResponse": [
      null
    ],
    "jsonpCallbackParam": "callback",
    "url": "https://Idonotexist",
    "headers": {
      "Accept": "application/json, text/plain, */*"
    }
  },
  "statusText": ""
}

取消请求时出错:

{
  "data": null,
  "status": -1,
  "config": {
    "method": "GET",
    "transformRequest": [
      null
    ],
    "transformResponse": [
      null
    ],
    "jsonpCallbackParam": "callback",
    "timeout": {
      "$$state": {
        "status": 1,
        "processScheduled": false,
        "pur": true
      }
    },
    "url": "https://www.googleapis.com/books/v1/volumes?q=isbn:0747532699",
    "headers": {
      "Accept": "application/json, text/plain, */*"
    }
  },
  "statusText": ""
}

我有一个包含promise的config.timeout但我想避免使用它。我想将浏览器取消的请求请求视为没有取消者。

以下是jsfiddle示例。

有没有办法在取消的请求上添加一个拦截器然后专门标记?

更新

这无法解决angularjs $ http代码没有分隔错误而不是超时或中止。你可以看到它here

正在运行pull request

0 个答案:

没有答案