2012-11-20 14 views
5

Sto utilizzando ExtJS 4.1 e sto ricevendo un'eccezione non rilevata in Google Chrome quando si verifica un timeout.Eccezione non rilevata dopo il timeout Ext.Ajax.request in 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 
}); 

Le richieste termina in un timeout e i dati ricevuti finora vengono provati per essere analizzati in un oggetto. Così l'eccezione non rilevata che sto vedendo nella console sviluppatore assomiglia:

errore non rilevato: 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

Questo problema non venire in FF. A causa dell'eccezione non rilevata, il mio metodo failureDuringResourceLoad non viene chiamato.

Può essere opportuno menzionare che i dati vengono trasmessi ancora quando è trascorso il timeout definito.

qualche idea?

+0

Sei in esecuzione su localhost/o in esecuzione da file: //? – A1rPun

+0

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

+0

OK. [Avete controllato altre voci SO?] (Http://stackoverflow.com/questions/2357430/invalid-state-err-dom-exception-11) – A1rPun

risposta

3

Dopo alcune ricerche ho scoperto che il comportamento di xhr.abort() differisce in Chrome e FF. In Chrome, xhr.status rimane invariato 200, mentre lo stato in FF è impostato su 0 dopo aver chiamato xhr.abort().

Questa differenza causa un effetto in ExtJS 4.1, che le richieste di timeout vengono scambiate come risposte valide. Ho usato il seguente override per gestire lo scenario di timeout. In ExtJS 4.1 una variabile sugli oggetti richiesta segna se si è verificato un timeout. L'override sostituisce il metodo 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; 
    } 
}); 

La modifica può essere trovata sulla riga 856 nella posizione originale in Connection.js. Ho esteso

success = result.success; 

a:

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

Se c'è un modo più conveniente per risolvere questo problema per favore fatemelo sapere!

+1

+1 Dovresti postarlo nel [forum degli errori ExtJS] (http://www.sencha.com/forum/forumdisplay.php?80-Ext-Bugs) –

+0

thx Rob, ho fatto come suggerito! – Chris

Problemi correlati