轉自:http://www.smellcode.cn/index.php/javascript/ext20zhongfasongtongbuqingqiu/ 在extjs的forum中,大家似乎覺得Ajax就是非同步,發送同步請求不合理,沒有效率。 但在我的開發中,確實就有。比如,在desktop中getModules要返回一個數組,如果我從後台解析一個xml,來動態產生這個數組,那麼在這裡 如果是直接return一個ajax調用的函數,就有可能得到一個空數組,因為資料還沒有解析完成就執行了return,跳出了getModules函數 了。 在尋找了一陣子後,我在ext-base.js中找到了Ext.lib.Ajax類。 Ext.lib.Ajax.getConnectionObject().conn可以得到一個XMLHttpRequest對象(我把它賦給xhr)。 這裡有一些關鍵ext-base的代碼: getConnectionObject:function() { var o; var tId = this.transactionId;
try { o = this.createXhrObject(tId); if (o) { this.transactionId++; } } catch(e) { } finally { return o; } },
////////////////////這裡個方法建立了XMLHttpRequest對象////////////////////////////////////////////
createXhrObject:function(transactionId) { var obj,http; try {
http = new XMLHttpRequest();
obj = { conn:http, tId:transactionId }; } catch(e) { for (var i = 0; i < this.activeX.length; ++i) { try {
http = new ActiveXObject(this.activeX[i]);
obj = { conn:http, tId:transactionId }; break; } catch(e) { } } } finally { return obj; } },
然後這就相當於你用底層的js得到了這個對象後,可以做最底層的處理了。 xhr.open(”POST”, your_url, false); 關鍵是要設定false這個參數,這就可以通過xhr.send(null)發送同步請求。 然後你就可以xhr.responseXML來得到對應的xml的完整的document對象。 現在就可以just for fun了。 |