私は毎回タイムアウトを設定できることを知っています:
$http.get('path/to/service', {timeout: 5000});
...しかし、コードを DRY に保つためにグローバル タイムアウトを設定したいと考えています。
私は毎回タイムアウトを設定できることを知っています:
$http.get('path/to/service', {timeout: 5000});
...しかし、コードを DRY に保つためにグローバル タイムアウトを設定したいと考えています。
これは、bleeding-edge 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');
UPDATED : $http は、httpProvider で設定されたタイムアウトのデフォルト設定を尊重しません (コメントを参照)。考えられる回避策: https://gist.github.com/adnan-i/5014277
元の答え:
angular.module('MyApp', [])
.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.timeout = 5000;
}]);
投稿と更新ありがとうございます!!
特に のためにこの問題を調査する$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を使用している場合、396行目のangular-resource.jsのソースファイルを編集することが$http
できます。すべてのタイムアウトプロパティを自分で追加できる場所への呼び出しが見つかりますリソース要求。
言及されておらず、Stewie のソリューションをテストする必要があったため、タイムアウトが発生した場合、エラーと中止/タイムアウトを区別する方法は、「ステータス」引数をチェックすることです。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 を使用しています。上記の解決策はどれも実行可能とは思えないため、以下のコードを思いつきました(タイムアウトを1か所でグローバルにしたいという意味で実行可能です)。基本的に、私は元の $http メソッドをマスクし、リクエストtimeout
ごとに追加し$http
、 , などの他のショートカット メソッドをオーバーライドして、新しい masked を使用するようget
にpost
しています$http
。
/**
* @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)
} ]);