1. 程式人生 > >extjs ajax 非同步請求正常同步請求出錯問題的可能原因

extjs ajax 非同步請求正常同步請求出錯問題的可能原因

之前該應用一直工作正常,突然有一天不能正常獲取資料,跟蹤該請求後發現,

"Failed to set the 'timeout' property on 'XMLHttpRequest': timeouts cannot be set for synchronous requests made from a document."

猜測可能原因是因為瀏覽器升級!

處理方法:

修改ext-base.js方法中

makeRequest : function(method, uri, callback, postData, options)方法的

中程式碼:

 if(callback && callback.timeout)

為:

if(callback && callback.timeout && options.async)

參考:

Ext.Ajax.request傳送同步請求---基於ext-basex 

首先從 http://code.google.com/p/ext-basex/ 下載ext-basex 指令碼檔案,解壓後按照說明readme檔案的方法引用EXT庫和ext-basex。 
<head> 
<link rel="stylesheet" type="text/css" href="../lib/ext-3.0+/resources/css/ext-all.css" /> 


<script type="text/javascript" src="../lib/ext-3.0+/adapter/ext/ext-base.js"></script> 
<script type="text/javascript" src="../lib/ext-3.0+/ext-all[-debug].js"></script> 
<script type="text/javascript" src="../lib/ux/ext-basex[-debug].js"></script> 
</head> 
然後使用Ext.Ajax.request方法,新增 async: false,   //ASYNC 是否非同步( TRUE 非同步 , FALSE 同步),其他引數不變。 

        Ext.Ajax.request({ 
            url: "StreamingProxy.ashx",    
            method: "GET", 
async: false,   //ASYNC 是否非同步( TRUE 非同步 , FALSE 同步) 
            success: function(response, opts) { 
            }, //請求成功的回撥函式 
            failure: function() { alert("獲取目錄請求失敗!"); } // 請求失敗的回撥函式 
        }); 


注意:做了以上操作後在IE、google chrome、firefox11下是沒有問題的,但到了firefox12下去看,就發現執行這個的時候一直執行的是失敗,也就是走到failure中去了。 

Ext.Ajax.request({ 
url : 'UserValidate', 
method : 'post', 
params : { 
type : 'checksession' 
}, 
async : false, // async 是否非同步( true 非同步 , false 同步) 
success : function(response, opts) { 
alert('response.responseText:'+response.responseText); 
var val = Ext.util.JSON.decode(response.responseText); 
if (val.nosession) { 
window.location.href = "index.html"; 
return; 

}, 
failure : function(response,options) { 
alert('4444444444444444444444444'); 
alert('failure response.responseText:'+response.responseText); 
window.location.href = "index.html"; 
return; 

}); 

如果加上“async : false, // async 是否非同步( true 非同步 , false 同步)”則在firefox中無法執行EXt.ajax.request請求,也就是老跑到failure中去,這個同步是要加上ext-basex.js的。 




解決辦法: 
修改 ext - basex-debug .js 檔案中的一條語句: 
將以下程式碼:

if(callback && callback.timeout){

改為:
if(callback && callback.timeout && options.async){

正如大家看到的一樣,添加了“&& options.async”。 

改完上面的地方就可以了。 

如果你不是使用的debug版,使用的是壓縮的版本,那麼在 ext - basex .js中查詢“if(u&&u.timeout){”(注意不含引號),找到後修改為“if(u&&u.timeout&&n.async){”,當然,你可以直接替換。 
結論: 
將“if(u&&u.timeout){”改為“if(u&&u.timeout&&n.async){”。 

注意:測試的時候一定要先清理一下快取,我試的時候一直沒有效果,後來發現是快取原因。 
怎樣清理瀏覽器快取[各種瀏覽器]        
http://blog.csdn.net/e_wsq/article/details/7521468 

也有人說改另一個地方,不過我沒有試,上面是我試了沒有問題的。 

in ext-basex.js 4.1 about line 1011 
('timeout' in r) && (r.timeout = callback.timeout); 
modified to : 
(options.async) && ('timeout' in r) && (r.timeout = callback.timeout);