Я знаю, що можу встановити тайм-аут кожен раз:
$http.get('path/to/service', {timeout: 5000});
... але я хочу встановити глобальний тайм-аут, щоб мій код був сухим.
Я знаю, що можу встановити тайм-аут кожен раз:
$http.get('path/to/service', {timeout: 5000});
... але я хочу встановити глобальний тайм-аут, щоб мій код був сухим.
$http.post('path/to/service', {data:data});
Відповіді:
ОНОВЛЕНО : $ http не буде поважати налаштування за замовчуванням для часу очікування, встановіть його в httpProvider (див. Коментарі). Можливе рішення: https://gist.github.com/adnan-i/5014277
Оригінальна відповідь:
angular.module('MyApp', [])
.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.timeout = 5000;
}]);
Це можливо за допомогою angular.js, що перекриває край (протестовано на 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, я подумав, що детальніше розповім про те, що я знайшов:
$httpзапиту:https://github.com/angular/angular.js/issues/2190 http://code.angularjs.org/1.1.5/docs/api/ngResource.$resource
Для тих з нас, які працювали в попередніх версіях, зокрема я використовую angular 1.0.6, можна відредагувати вихідний файл для angular-resource.js у рядку 396, ви знайдете виклик, $httpкуди ви можете додати властивість тайм-ауту самостійно для всіх запити ресурсів.
Оскільки про це не згадувалось, і мені довелося протестувати рішення Стюї, коли виникає тайм-аут, спосіб визначити між помилкою та перериванням / тайм-аутом - перевірка аргументу "статус". Він повернеться 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, як показано нижче:
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)
} ]);