76

私は毎回タイムアウトを設定できることを知っています:

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

...しかし、コードを DRY に保つためにグローバル タイムアウトを設定したいと考えています。

4

4 に答える 4

105

これは、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');
于 2013-03-29T11:42:23.917 に答える
41

UPDATED : $http は、httpProvider で設定されたタイムアウトのデフォルト設定を尊重しません (コメントを参照)。考えられる回避策: https://gist.github.com/adnan-i/5014277

元の答え:

angular.module('MyApp', [])
  .config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.timeout = 5000;
}]);
于 2013-02-22T09:18:33.953 に答える
9

投稿と更新ありがとうございます!!

特に のためにこの問題を調査する$resource際に、発見したことについて詳しく説明したいと思いました。

  • この問題はトラッカーに記録されており、angular 1.1.5 では、タイムアウト プロパティを$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
    } 
    
于 2013-08-07T19:18:54.233 に答える
1

私は同じ要件を持っており、AngularJS 1.0.7 を使用しています。上記の解決策はどれも実行可能とは思えないため、以下のコードを思いつきました(タイムアウトを1か所でグローバルにしたいという意味で実行可能です)。基本的に、私は元の $http メソッドをマスクし、リクエストtimeoutごとに追加し$http、 , などの他のショートカット メソッドをオーバーライドして、新しい masked を使用するようgetpostしています$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)

} ]);
于 2013-09-02T12:44:12.890 に答える