angular 中取消 HTTP 请求和解决错误功能

Canceling HTTP request and resolving error function in angular

您好,我想在 2 秒后取消我的 http 请求。如果没有收到数据,它应该解析为错误函数和 return 一个空对象。

我知道我必须以某种方式使用超时 属性。我在哪里使用 $timeout 呢?我不太确定我是否理解正确。

app
  .service('testService',['$http','$q','$timeout',
    function($http,$q,$timeout){

      var canceler=$q.defer();

      this.options = function (long,lat) {


        return $http({
          method: 'POST',
          url: '/coordinates',
          headers: {
            'Content-Type' : 'application/json; charset=utf-8',
            'Data-Type': 'json'
          },
          data: {
            "long":long,
            "lat": lat
          },
          timeout:canceler.promise

        }).then(function (response) {
          return response.data;
        },function(error){
          return {};
        });
      };
    }]);

在您的 $timeout 中使用 reject 作为

$timeout(function(){
    return canceler.reject(reason);
},2000);

因此,您 $http 请求看起来像:

var timeoutCase = function(){
    $timeout(function(){
        return canceler.reject(reason);
    },2000);
}

var apiCall = function(){

   // call timeout function
   timeoutCase();

   // http call
   return $http({
      method: 'POST',
      url: '/coordinates',
      headers: {
        'Content-Type' : 'application/json; charset=utf-8',
        'Data-Type': 'json'
      },
      data: {
        "long":long,
        "lat": lat
      },
      timeout:canceler.promise

    }).then(function (response) {
$timeout.cancel(timeoutCase);
      return response.data;
    },function(error){
      return {};
    });
}

// call Http function.
api().then(function(response){
    console.log(response);
})

您可以将配置对象传递给您正在使用的方法(在您的场景 POST 中):

post(url, data, [config]);

在配置对象中您可以指定超时 属性:

timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.

因此,您的 POST 方法调用示例如下:

$http.post('www.host.com/api/resource', {payload}, {timeout:2000})
          .then(function(){ //success });
          .catch(function(){ return {};});

return {}; 就是模拟你说的空对象。

在 angular 文档站点上有一些使用 $http 服务的好例子

另一方面,$timeout 是 Angular 对 window.setTimeout 的包装,这里是 link 对 documentation 的包装。

因此您可以使用 $timeout 来触发 resolve 您的取消承诺,或者让超时 属性 在执行请求时完成它的工作。那将取决于您的要求。但我的建议是对您正在执行的请求使用超时 属性。不需要通过外部计时器取消请求。

您可以使用 $timeout 来实现这一点。您根据哪个先结束取消http请求或超时承诺。如果首先发生超时,则取消 http 请求,如果 http promise 在超时之前解决,则取消超时。这是一个例子:

var httpPromise = $http({
          method: 'POST',
          url: '/coordinates',
          headers: {
            'Content-Type' : 'application/json; charset=utf-8',
            'Data-Type': 'json'
          },
          data: {
            "long":long,
            "lat": lat
          }
        });

var timeoutPromise = $timeout(function () {
      httpPromise.reject("Timeout occurred"); // timeout occurred first, reject httpPromise.
}, 2000);

return httpPromise.then(function(data){
   $timeout.cancel(timeoutPromise); //http request resolved before timeout occurred, cancel the timeout.
   return data;
});