2016-12-13 4 views
0

У меня есть контроллер, который выполняет HTTP-запрос.
Этот запрос может занять от 2 секунд до 4 минут, чтобы вернуть некоторые данные.
Я добавил кнопку, чтобы пользователи должны были щелкнуть, чтобы отменить запрос, если поиск слишком длинен для завершения.Отмена предложения по угловому сервису

Контроллер:

$scope.search = function() { 
    myFactory.getResults() 
     .then(function(data) { 
     // some logic 
     }, function(error) { 
     // some logic 
    }); 
} 

Услуги:

var myFactory = function($http, $q) { 
    return { 
     getResults: function(data) { 
      var deffered = $q.dafer(); 
      var content = $http.get('someURL', { 
       data: {}, 
       responseType: json 
      )} 

      deffered.resolve(content); 
      returned deffered.promise; 
     } 
    } 
} 

нажатия кнопок:

$scope.cancelGetResults = function() { 

    // some code to cancel myFactory.getResults() promise 

} 

Как я могу impleme nt нажмите кнопку, чтобы отменить обещание myFactory.getResults()?

+0

Нужна ли вам ** ручная ** отмена или что-то с тайм-аутом соответствует вашим потребностям? – Mistalis

+0

@Mistalis - руководство пользователя, так как пользователи могут либо ждать запроса до таймаута, либо нажать «Отмена» –

+0

Возможный дубликат [Как отменить запрос $ http в AngularJS?] (Http://stackoverflow.com/questions/13928057/how -to-cancel-an-http-request-in-angleularjs) – Liam

ответ

0

Вы можете использовать метод .resolve(), который должен быть доступен.

Передайте обещание в контроллере переменной.

Создать, например. отменить метод, который берет на себя обещание в качестве аргумента в вашей фабрике. Затем вызовите этот метод в функции cancelGetResults() в контроллере.

В способе отмены, который вы только что позвонили .реализовать принятое обещание.

Это должно быть на самом деле.

https://www.bennadel.com/blog/2731-canceling-a-promise-in-angularjs.htm

+0

Ваша ссылка мертва. – Mistalis

+0

Не так ли? Это отлично работает для меня ... У кого-то такая же проблема? –

1

Вопрос использует deferred antipattern, которые, как правило, следует избегать, но он подходит случай отмены:

getResults: function(data) { 
    var deffered = $q.defer(); 

    $http.get('someURL', { 
     data: {}, 
     responseType: json 
    }).then(deffered.resolve, deferred.reject); 

    deffered.promise.cancel = function() { 
     deferred.reject('CANCELLED') 
    }; 

    returned deffered.promise; 
} 
+0

Спасибо за это, однако, я не понимаю, как $ scope.cancelGetResults можно использовать с этим? –

+1

Что-то вроде '$ scope.resultsPromise = myFactory.getResults (...)' в '$ scope.search'. И 'if ($ scope.resultsPromise) $ scope.resultsPromise.cancel()' в '$ scope.cancelGetResults' метод. – estus

+0

Пробовал выше, однако я не могу заставить его работать, ошибка «Не могу прочитать свойство« отменить »неопределенного« Пожалуйста, предоставьте плункер. –

1

GetResult это услуга, в которой мы осуществляем отмену.

getResult = function(){ 
var deferred = $q.defer(); 
$http.get(url).success(function(result){ 
    deffered.resolve(result); 
}).error(function(){ 
deffered.reject('Error is occured!'); 
}); 
return deferred.promise; 
}; 

где переменная url используется вместо любого URL-адреса Restfully API. Вы можете использовать его с заданным кодом.

getResult().then(function (result) { console.log(result); }; 
Смежные вопросы