2016-09-01 3 views
2

Я пробовал пару вещей, но не могу отменить HTTP-запрос при вызове функции до того, как будет выполнен предыдущий запрос. Я использую 1.5.7, и каждый раз, когда выполняется $ scope.gls Invite, я хочу отменить любые ожидающие запросы glsemed.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; 

    } 

} 

ответ

0

Поскольку вы положили timeout: defer.promise в качестве одного из вариантов для вашего запроса $ HTTP, запрос не будет отменен до defer.promise решает.

Так что, когда вы положили defer.resolve в обратный вызов req.success, это не имеет смысла, потому что вы в основном пытаетесь отменить $ http-запрос после его завершения.

Также, $http.get фактически возвращает обещание, поэтому нет необходимости возвращать его результаты через другое обещание. В методе get() вы можете фактически вернуть req и обрабатывать результаты в обратном вызове then.

Возможно, вы также должны сделать другой способ в своей службе, который возвращает defer.promise и вызывает этот метод в вашем контроллере. Вы можете затем resolve, которые обещали в контроллере, когда вы хотите отменить запрос $ http.

Извините, я знаю, что это немного запутанно, но дайте мне знать, если это имеет смысл или вам нужны дополнительные объяснения.

Смежные вопросы