2012-11-20 27 views
5

我正在使用ExtJS 4.1,並且在發生超時時在Google Chrome中收到未捕獲的異常。超時後未捕獲的異常Ext.Ajax.request在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 
}); 

請求以超時結束,並且目前接收到的數據被嘗試在對象中解析。使我看到在開發者控制檯未捕獲異常的樣子:

未捕獲的錯誤:INVALID_STATE_ERR:DOM異常11個Connection.js:914個 Ext.define.createResponse Connection.js:914 Ext.define。的onComplete Connection.js:859個 Ext.define.abort Connection.js:767 request.timeout

這個問題在FF不上來。由於未捕獲的異常,我的方法failureDuringResourceLoad未被調用。

值得一提的是,當超過定義的超時值時,數據仍在傳輸。

有什麼想法?

+0

你在本地主機上運行/或從file://運行? – A1rPun

+0

localhost /分別http://server.com/ – Chris

+0

好的。 [您是否檢查過其他SO條目?](http://stackoverflow.com/questions/2357430/invalid-state-err-dom-exception-11) – A1rPun

回答

3

經過一番研究,我發現Chrome和FF中的xhr.abort()行爲有所不同。在Chrome中,xhr.status保持不變200,而調用xhr.abort()後,FF中的狀態設置爲0。

這種差異會在ExtJS 4.1中產生影響,即超時請求被誤認爲是有效的響應。我使用了下面的覆蓋來處理超時情況。在ExtJS 4.1中,請求對象上的變量標記是否發生超時。覆蓋取代了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; 
    } 
}); 

可以在Connection.js的原始位置的第856行找到更改。我已經擴展

success = result.success; 

到:

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

如果沒有解決這個問題,請讓我知道一個更方便的方法!

+1

+1你應該在[ExtJS bug論壇](http://www.sencha.com/forum/forumdisplay.php?80-Ext-Bugs) –

+0

thx Rob中發佈這個,我按照建議做了! – Chris