Как установить глобальный таймаут http в AngularJs
Я знаю, что могу установить тайм-аут каждый раз:
$http.get('path/to/service', {timeout: 5000});
… но я хочу установить глобальный тайм-аут, чтобы сохранить мой код DRY.
- Нужны некоторые примеры привязки атрибутов в пользовательских тегах AngularJS
- AngularJS ng-options создают диапазон
- Угловые $ http vs service vs ngResource
- Кордова / Ионная: $ http-запрос не обрабатывается во время эмуляции или работы на устройстве
- есть ли обратная связь для рендеринга для Angular JS?
- Как добавить специальную проверку в форму AngularJS?
- Чтобы проверить настраиваемую директиву angularjs validation
- Confused об Angularjs, заключаемых и изолирующих областях и привязках
- Борьба с controllerом AngularJS дважды
- Каков наилучший способ условного применения атрибутов в AngularJS?
- Ng-click не работает внутри ng-repeat
- Как подождать, пока ответ поступит из запроса $ http, в angularjs?
- Могут ли маршруты angularjs иметь дополнительные значения параметров?
ОБНОВЛЕНО : $ http не будет соблюдать настройку по умолчанию для тайм-аута, установленную в httpProvider (см. Комментарии). Возможное обходное решение: https://gist.github.com/adnan-i/5014277
Оригинальный ответ:
angular.module('MyApp', []) .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.timeout = 5000; }]);
Это возможно с угловыми углами. (Проверено с помощью git master 4ae46814ff).
Вы можете использовать HTTP-перехватчик запросов. Как это.
angular.module('yourapp') .factory('timeoutHttpIntercept', function ($rootScope, $q) { return { 'request': function(config) { config.timeout = 10000; return config; } }; });
А затем в .config введите $ httpProvider и сделайте следующее:
$httpProvider.interceptors.push('timeoutHttpIntercept');
Спасибо за сообщение и обновление!
Изучая эту проблему специально для $resource
, я подумал, что подробно остановимся на том, что я нашел:
- Эта проблема была зарегистрирована в трекере и в угловом 1.1.5, есть поддержка для передачи свойства тайм-аута через запрос
$http
:
https://github.com/angular/angular.js/issues/2190 http://code.angularjs.org/1.1.5/docs/api/ngResource.$resource
-
Для тех из нас, которые были в более ранних версиях, в частности, я использую угловой 1.0.6, можно отредактировать исходный файл для angular-resource.js в строке 396, вы найдете вызов
$http
где вы можете добавить свойство тайм-аута самостоятельно для всех запросов ресурсов. -
Поскольку он не упоминался, и я должен был протестировать решение Стьюи, когда происходит тайм-аут, способ сообщить между ошибкой и прерыванием / таймаутом проверяет аргумент «status». Он вернет
0
для тайм-аутов вместо404
:$http.get("/home", { timeout: 100 }) .error(function(data, status, headers, config){ console.log(status) }
-
Поскольку есть только несколько случаев, когда мне нужно использовать тайм-аут, а не устанавливать его глобально, я обматываю запросы в функции
$timeout
, например://errorHandler gets called wether it's a timeout or resource call fails var t = $timeout(errorHandler, 5000); myResource.$get( successHandler, errorHandler ) function successHandler(data){ $timeout.cancel(t); //do something with data... } function errorHandler(data){ //custom error handle code }
У меня такое же требование, и я использую AngularJS 1.0.7. Я придумал приведенный ниже код, поскольку ни одно из вышеперечисленных решений для меня не представляется возможным (возможно, в том смысле, что я хочу, чтобы тайм-аут был глобальным в одном месте). В основном, я маскирую оригинальные методы $ http и добавляю timeout
для каждого запроса $http
и переопределяя другие методы быстрого доступа, такие как get
, post
, … так, чтобы они использовали новый маскированный $http
.
JSFiddle для кода ниже:
/** * @name ngx$httpTimeoutModule * @description Decorates AngularJS $http service to set timeout for each * Ajax request. * * Implementation notes: replace this with correct approach, once migrated to Angular 1.1.5+ * * @author Manikanta G */ ;(function () { 'use strict'; var ngx$httpTimeoutModule = angular.module('ngx$httpTimeoutModule', []); ngx$httpTimeoutModule.provider('ngx$httpTimeout', function () { var self = this; this.config = { timeout: 1000 // default - 1 sec, in millis }; this.$get = function () { return { config: self.config }; }; }); /** * AngularJS $http service decorator to add timeout */ ngx$httpTimeoutModule.config(['$provide', function($provide) { // configure $http provider to convert 'PUT', 'DELETE' methods to 'POST' requests $provide.decorator('$http', ['$delegate', 'ngx$httpTimeout', function($http, ngx$httpTimeout) { // create function which overrides $http function var _$http = $http; $http = function (config) { config.timeout = ngx$httpTimeout.config.timeout; return _$http(config); }; $http.pendingRequests = _$http.pendingRequests; $http.defaults = _$http.defaults; // code copied from angular.js $HttpProvider function createShortMethods('get', 'delete', 'head', 'jsonp'); createShortMethodsWithData('post', 'put'); function createShortMethods(names) { angular.forEach(arguments, function(name) { $http[name] = function(url, config) { return $http(angular.extend(config || {}, { method : name, url : url })); }; }); } function createShortMethodsWithData(name) { angular.forEach(arguments, function(name) { $http[name] = function(url, data, config) { return $http(angular.extend(config || {}, { method : name, url : url, data : data })); }; }); } return $http; }]); }]); })();
Добавьте зависимость от вышеуказанного модуля и настройте таймаут, настроив ngx$httpTimeoutProvider
, как ngx$httpTimeoutProvider
ниже:
angular.module('App', ['ngx$httpTimeoutModule']).config([ 'ngx$httpTimeoutProvider', function(ngx$httpTimeoutProvider) { // config timeout for $http requests ngx$httpTimeoutProvider.config.timeout = 300000; // 5min (5 min * 60 sec * 1000 millis) } ]);