失敗溶液:一個給定的setTimeout後我殺死活性傳輸和重新啓動所述信道,它處理在客戶端側的一切。我通過將每個綁定到一個ID來避免請求衝突,並根據每次發出請求時以及每次請求完成時增加的全局引用來檢查它。
function longRunningCallCheck(refId) {
// make sure the reference id matches the global id.
// this indicates that we are still processing the
// long running ajax call.
if(refId == id){
// perform client processing here
// kill all active transport layers
var t = Wicket.Ajax.transports;
for (var i = 0; i < t.length; ++i) {
if (t[i].readyState != 0) {
t[i].onreadystatechange = Wicket.emptyFunction;
t[i].abort();
}
}
// process the default channel
Wicket.channelManager.done('0|s');
}
}
不幸的是,這仍然使PageMap被阻塞,任何後續調用都會等待請求在服務器端完成。
我在這一點的解決方案是替代地提供用戶選項使用BookmarkablePageLink註銷(其實例化新的頁面,因此不具有對頁映射爭用)。絕對不是最佳的。
任何更好的解決方案都是值得歡迎的,但這是我能想到的最好的解決方案。
感謝沃爾夫岡。我應該提到我們正在爲我們認爲可能會長時間運行的調用(報告,大型數據集等)異步地處理模型,但是我們正試圖解決這個問題,偶爾出乎意料的請求需要很長時間才能發現不可預知的原因。有時候,這是由於數據庫問題(重新編制索引,糟糕的查詢設計等)造成的,有時這是由於第三方服務請求花費的時間比預期長。理想情況下,我們會將所有這些調用異步封裝,但在軟件生命週期的這一點上,這是不可行的。感謝您的輸入。 – 2010-03-08 14:20:45