Как установить глобальный таймаут http в AngularJs

Я знаю, что могу установить тайм-аут каждый раз:

$http.get('path/to/service', {timeout: 5000}); 

… но я хочу установить глобальный тайм-аут, чтобы сохранить мой код DRY.

ОБНОВЛЕНО : $ 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) } ]); 
  • Как предотвратить дублирование пользовательских свойств в Firebase?
  • AngularJS - визуализация на стороне сервера
  • Как интегрировать флот с AngularJS?
  • Угловые директивы - когда и как использовать компиляцию, controller, предварительную ссылку и пост-ссылку
  • Несколько директив , запрашивающих новую / выделенную область
  • Angularjs JSONP не работает
  • Как перебирать ключи и значения с помощью ng-repeat в AngularJS?
  • Ошибка AngularJS .success не является функцией
  • Поведение на уровне angular.js - отключить глубокую привязку для определенных URL-адресов
  • AngularJS: ngRoute не работает
  • Ввести услугу в app.config
  • Давайте будем гением компьютера.