如何取消角$ http请求1.5

时间:2016-09-01 22:18:14

标签: angularjs

我已经尝试了一些东西但是在上一个请求完成之前调用该函数时似乎无法取消http请求。我使用1.5.7并且每次执行$ scope.glsuggested我想取消任何挂起的glsuggested.get()请求,尝试了一些事情来拒绝$ q.defer但没有运气。

这是我得到的:

// Controller.
export class BudgetController {
  constructor ($scope, $q, $timeout, $log, glbudget, glsuggested) {
    'ngInject';

    $scope.glsuggested = function(cat) {
      var _getsuggested = glsuggested.get(cat);
      _getsuggested.then(function(data) {
        $scope.glproducts = data;
      }, function(error) {
        $scope.budgetdetails = 'error';
        $log.log(error);
      });
    };

  }
}

// Service
export class GlsuggestedService {
  constructor ($http, $q, $rootScope, $log) {
    'ngInject';
    this.$http = $http;
    this.$q = $q;
    this.$rootScope = $rootScope;
    this.$log = $log;
  }

  get(category) {

    var defer = this.$q.defer();

    var headers = {
      'Access-Control-Allow-Origin': '*',
      'Content-Type': 'application/json'
    };

    var req = this.$http({
      method: 'GET',
      headers: headers,
      url: this.$rootScope.apiurl + '/products/recommend/' + category,
      timeout: defer.promise
    });

    var _log = this.$log.log;

    req.success(function(data) {
      _log('success!', data, data.id);
      return defer.resolve(data);
    });

    req.error(function(data) {
      _log('error!', data);
      return defer.reject('error');
    });

    return defer.promise;

  }

}

1 个答案:

答案 0 :(得分:0)

由于您将timeout: defer.promise作为$ http请求的其中一个选项,因此在defer.promise结算之前请求不会取消。

因此,当您将defer.resolve放入req.success回调时,它没有意义,因为您基本上是在完成后尝试取消$ http请求。

此外,$http.get实际上返回了一个promise,因此无需通过另一个promise返回其结果。在get()方法中,您实际上可以返回req并在then回调中处理结果。

您可能还应在服务中创建另一个返回defer.promise并在控制器中调用该方法的方法。然后,当您想要取消$ http请求时,您可以在控制器中承诺resolve

抱歉,我知道这有点令人困惑,但如果有意义或者您需要进一步解释,请告诉我。