2012-11-20 9 views
5

Używam ExtJS 4.1 i otrzymuję nieprzechwycony wyjątek w przeglądarce Google Chrome po przekroczeniu limitu czasu.Nieukończony wyjątek po przekroczeniu limitu czasu Ext.Ajax.request w przeglądarce Chrome

Ext.Ajax.timeout = 10000; // 10 seconds 
Ext.Ajax.method = "GET"; 
Ext.Ajax.request({ 
    url:'rest/dataloggerset.json', 
    params:{ 
      sessionGuid:Ext.getStore("User").getAt(0).get("sessionGuid"), 
      loggerId:this.availableLogFiles.loggerId, 
      logSet:this.currentLog 
    }, 
    success:this.processReceivedLogData, 
    failure:this.failureDuringResourceLoad, 
    scope:this 
}); 

Wnioski kończy się limit czasu i do tej pory otrzymane dane są starał się być analizowany w obiekcie. Więc nieprzechwycony wyjątek, który widzę w konsoli programisty wygląda następująco:

Uncaught Błąd: INVALID_STATE_ERR: DOM Exception 11 Connection.js: 914 Ext.define.createResponse Connection.js: 914 Ext.define. onComplete Connection.js: 859 Ext.define.abort Connection.js: 767 request.timeout

Ten problem nie pojawią się w FF. Z powodu nieprzechwyconego wyjątku moja metoda failureDuringResourceLoad nie jest wywoływana.

Warto wspomnieć, dane są nadal przesyłane, gdy upłynie zdefiniowany czas oczekiwania.

jakieś pomysły?

+0

Czy używasz localhost/lub działa z pliku: //? – A1rPun

+0

localhost/odpowiednio http://server.com/ – Chris

+0

W porządku. [Czy sprawdziłeś inne wpisy SO?] (Http://stackoverflow.com/questions/2357430/invalid-state-err-dom-exception-11) – A1rPun

Odpowiedz

3

Po kilku badaniach odkryłem, że zachowanie xhr.abort() różni się w Chrome i FF. W Chrome xhr.status pozostaje niezmieniony 200, natomiast status w FF jest ustawiony na 0 po wywołaniu xhr.abort().

Ta różnica powoduje efekt w ExtJS 4.1, że żądania dotyczące czasu oczekiwania są błędne jako prawidłowe odpowiedzi. Użyłem następującego przesłonięcia do obsłużenia scenariusza limitu czasu. W ExtJS 4.1 zmienna na obiektach żądania oznacza, że ​​nastąpiło przekroczenie limitu czasu. Zastąpienie zastąpi metodę onComplete.

Ext.define('Df.data.Connection', { 
    override: 'Ext.data.Connection', 

    onComplete : function(request) { 
     var me = this, 
      options = request.options, 
      result, 
      success, 
      response; 

     try { 
      result = me.parseStatus(request.xhr.status); 
     } catch (e) { 
      // in some browsers we can't access the status if the readyState is not 4, so the request has failed 
      result = { 
       success : false, 
       isException : false 
      }; 
     } 

     success = result.success && !request.timedout; 

     if (success) { 
      response = me.createResponse(request); 
      me.fireEvent('requestcomplete', me, response, options); 
      Ext.callback(options.success, options.scope, [response, options]); 
     } else { 
      if (result.isException || request.aborted || request.timedout) { 
      response = me.createException(request); 
      } else { 
       response = me.createResponse(request); 
      } 
      me.fireEvent('requestexception', me, response, options); 
      Ext.callback(options.failure, options.scope, [response, options]); 
     } 
     Ext.callback(options.callback, options.scope, [options, success, response]); 
     delete me.requests[request.id]; 
     return response; 
    } 
}); 

Zmiany można znaleźć w wierszu 856 w oryginalnym miejscu w pliku Connection.js. Mam rozszerzone

success = result.success; 

do:

success = result.success && !request.timedout; 

Jeśli istnieje bardziej wygodny sposób na rozwiązanie tego problemu, proszę dać mi znać!

+1

+1 Powinieneś opublikować to na [forum błędów ExtJS] (http://www.sencha.com/forum/forumdisplay.php?80-Ext-Bugs) –

+0

thx Rob, zrobiłem, co sugerowałem! – Chris

Powiązane problemy