2013-02-22 16 views
71

में एक वैश्विक http समाप्ति सेट कैसे मैं जानता हूँ कि मैं एक टाइमआउट प्रत्येक और हर समय सेट कर सकते हैं:AngularJS

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

... लेकिन मैं अपने कोड सूखा रखने के लिए एक वैश्विक टाइमआउट सेट करना चाहते हैं।

+0

मुझे लगता है कि वास्तव में उस के लिए एक कारण है। सर्वर में आमतौर पर तेज और धीमी गति से अंतराल होते हैं, और मुझे लगता है कि कोणीय टीम नहीं चाहता था कि सभी को कॉल के लिए भी सबसे धीमा संभव टाइमआउट होना चाहिए जो आमतौर पर – OlivierM

+1

होना चाहिए, आप एक सेवा कर सकते हैं जो http अनुरोध करता है, इसे विधि भेजें, यूआरएल और डेटा और इसके अंदर जो भी डिफ़ॉल्ट कॉन्फ़िगरेशन आप चाहते हैं यूआरएल के डोमेन को शामिल करना और इसे बाकी के पास भी पास करना बेहतर है, और यह उन्हें पूरा यूआरएल –

उत्तर

37

अद्यतन: $ http समय-समय पर httpProvider में सेट करने के लिए डिफ़ॉल्ट सेटिंग का सम्मान नहीं करेगा (टिप्पणियां देखें)। संभावित समाधान: https://gist.github.com/adnan-i/5014277

मूल जवाब:

angular.module('MyApp', []) 
    .config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.timeout = 5000; 
}]); 
+1

बनाने में जोड़ता है सुनिश्चित करें कि ऊपर दिया गया कोड काम कर रहा है? ऐसा लगता है कि sendReq को कॉल करते समय config.timeout संशोधित नहीं किया गया है: https://github.com/angular/angular.js/blob/master/src/ng/http.js#L550 डिफ़ॉल्ट रूप से तुलना करें। साथ-साथ प्रमाण-पत्र ऊपर की रेखाएं, जो डिफ़ॉल्ट पर फ़ॉलबैक होगी। – orjan

+0

@orjan ठीक है, उपरोक्त उपरोक्त काम नहीं करेगा, अगर आप यही पूछ रहे हैं। कोड सिर्फ आपके स्वयं के कोणीय परियोजना के लिए कॉन्फ़िगरेशन विकल्प दिखाता है। अधिक जानकारी के लिए आप http://docs.angularjs.org/api/ng.$http – Stewie

+1

पर 'HTTP शीर्षलेख सेट करना' और 'पैरामीटर' अनुभागों पर एक नज़र डालेंगे, मुझे इसके कॉन्फ़िगरेशन उदाहरण के बारे में पता है और यह कोड है अपने आप पर नहीं चल रहा है। मैं हेडर और प्रमाणपत्रों के साथ डिफ़ॉल्ट के बारे में भी जानता हूं। लेकिन मुझे नहीं लगता कि चूक टाइमआउट के लिए काम कर रही है। मैंने एक jsfiddle बनाया है: http://jsfiddle.net/RYDMM/4/ समस्या को पुन: उत्पन्न करने का प्रयास कर रहा है, लेकिन ऐसा लगता है कि टाइमआउट jsonp को – orjan

95

यह ब्लीडिंग-एज Angular.js के साथ संभव है (Git मास्टर 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'); 
+6

एक आकर्षण की तरह काम करता है और स्वीकार्य उत्तर होना चाहिए क्योंकि यह 2 साल बाद है .... –

+2

ब्याज से, क्यों आप $ रूटस्कोप और $ q इंजेक्शन? या ये आपके द्वारा चिपकाए गए कोड के बाहर उपयोग किए जाते हैं? –

+1

इसके अलावा, आप इसे कैसे संभालेंगे? मुझे लगता है कि अनुरोध रद्द कर दिया गया है, क्या मैं इसके लिए श्रोता सेट कर सकता हूं? –

7

पद और अपडेट के लिए धन्यवाद !!

$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 का उपयोग कर रहा हूं, लाइन 3 9 6 पर कोणीय-संसाधन.जेएस के लिए स्रोत फ़ाइल को संपादित करना संभव है, आपको $http पर कॉल मिलेगा जहां आप टाइमआउट जोड़ सकते हैं सभी संसाधन अनुरोधों के लिए खुद को संपत्ति।

  • चूंकि इसका उल्लेख नहीं किया गया था और मुझे टाइमवे के समाधान का परीक्षण करना पड़ा, जब एक टाइमआउट होता है, तो त्रुटि और निरस्त/टाइमआउट के बीच बताने का तरीका 'स्थिति' तर्क की जांच कर रहा है। यह बजाय कहते हैं कि 404 समय समाप्ति के लिए 0 वापस आ जाएगी:

    $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 
    } 
    
+1

+! "एक त्रुटि और निरस्त/टाइमआउट के बीच बताने का तरीका" –

1

मैं एक ही आवश्यकता है और मैं AngularJS 1.0.7 का उपयोग कर रहा हूँ। मैं नीचे दिए गए कोड के साथ आया हूं क्योंकि उपरोक्त में से कोई भी समाधान मेरे लिए व्यवहार्य नहीं लगता है (इस अर्थ में व्यवहार्य है कि मैं एक स्थान पर वैश्विक होने का समय चाहता हूं)। असल में, मैं मूल $ http विधियों को मास्किंग करता हूं और प्रत्येक $http अनुरोध के लिए timeout जोड़ रहा हूं और 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) 

} ]);