2009-09-10 58 views
1

在我正在開發的Web應用程序中,有很長時間運行ajax查詢的潛力。

我使用jQuery的$就方法做這樣的事情:

this._xhr = jQuery.ajax({ 
    type: "GET", 
    url: "/path/to/service", 
    data: "name=value", 
    success: function(data, message){ 
     // handle a success 
    }, 
    dataType: "json" 
}); 

是否有修改後this._xhr.readyState = 2(加載)和之前的成功回調的方式this._xhr .readyState = 4(已完成)

我嘗試修改this._xhr.onreadystatechange,但發現jQuery沒有定義onreadystatechange。

+1

你能解釋你爲什麼要這樣做嗎?也許有一種解決方案不涉及在請求中間使用'success'功能 – 2009-09-10 19:00:08

+0

成功方法會執行一些昂貴的處理,但是用戶可以在長時間運行的ajax請求期間在UI中執行其他操作取消請求。如果發生這些操作,我將更改運行查詢的成功方法,以便在最終完成時顯示簡單消息,而不是執行不再需要的所有處理。我可以使用abort()方法,這可能是正確的方法,但我很好奇是否可以修改成功函數 – andrewwatts 2009-09-10 19:28:48

回答

0

abort方法聽起來對我來說是最好的選擇。

我對ajax方法內部知道不多,但我可以想出幾種方法來做你想做的事。兩者都涉及全局狀態,如果用戶可能在第一個請求完成之前發送第二個請求,則會中斷,因此我不確定我是否推薦他們。

首先,你可以繼續到,做你的成功的工作方法的引用,並改變它:

MySuccessMethod = function(d, m) { /* handle a success */ }; 

this._xhr = jQuery.ajax({ 
    type: "GET", 
    url: "/path/to/service", 
    data: "name=value", 
    success: function(data, message){ MySuccessMethod(data, message); }, 
    dataType: "json" 
}); 


// later... 
// user cancels request, so change the success method 
MySuccessMethod = function(d, m) { /*print a simple message*/ } 

或者,你可以只是把所有的邏輯在一個成功的方法,使用一個全局標誌來確定要做什麼:

success: function(data, message){ 
    if (RequestHasBeenCancelled) { 
     //display a simple message 
    } 
    else { 
     // handle a success 
    } 
}, 
+0

謝謝,我已經提前使用了'abort',但我喜歡這種想法在你的第一個建議中,我可以採取這個想法並應用類似於我的代碼的東西,而實際上不涉及全局狀態。再次感謝。 – andrewwatts 2009-09-13 19:47:09

相關問題