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);