我有一個Web應用程序必須執行以下任務。對於選定的日期範圍,它會向範圍中的每個日期的Web服務發出GET請求;這可能需要一段時間,並且因爲我想稍後可視化數據,所有調用都是同步的(每個請求的結果都存儲在一個數組中)。此檢索需要一段時間(幾秒鐘),這意味着主線程「凍結」。jQuery:在單獨的線程中檢索數據
什麼是避免這種情況的好方法? (例如,在單獨的線程中進行檢索並在完成後收到通知)。
我有一個Web應用程序必須執行以下任務。對於選定的日期範圍,它會向範圍中的每個日期的Web服務發出GET請求;這可能需要一段時間,並且因爲我想稍後可視化數據,所有調用都是同步的(每個請求的結果都存儲在一個數組中)。此檢索需要一段時間(幾秒鐘),這意味着主線程「凍結」。jQuery:在單獨的線程中檢索數據
什麼是避免這種情況的好方法? (例如,在單獨的線程中進行檢索並在完成後收到通知)。
您應該使您的GET請求異步,然後可視化所有請求完成。
var get1 = $get(..
var get2 = $get(..
var get3 = $get(..
$.when(get1, get2, get3).done(function (...) {
// do something with the response
visualize();
});
有趣。在我的情況下,GET請求的數量實際上取決於GET請求(它返回一個日期範圍)。 – blazs
實際上有一個簡單的解決方案。讓我們實現一個function
這就需要在所有的響應抵達執行:
function onFinished(responses) {
//Do something
}
現在,讓我們假設你有一個function
返回的日期爲數組:
function getDates(range) {
//Do something
}
此外,我們需要一個getURL
,像這樣:
function getURL(date) {
//Do something
}
最後,讓我們假設你有一個名爲dateRange
變量,它有您將在getDates
中用作輸入。因此,我們可以這樣做:
var requestDates = getDates(dateRange);
var requestsPending = requestDates.length;
var responses = [];
for (var requestIndex in requestDates) {
$.ajax({
url: getURL(requestDates[requestIndex]),
method: "GET",
//You might pass data as well here if needed in the form of
//data: yourobject,
}).done(function(data, textStatus, jqXHR) {
//Handle response, parse it and store the result using responses.push()
}).fail(function(jqXHR, textStatus, errorThrown) {
//Handle failed requests
}).always(function(param1, param2, param3) {
if (--requestsPending === 0) {
onFinished(responses);
}
});
}
這將發送您需要的每個日期AJAX請求,並等待他們的迴應異步,因此,您有效不等待的未決時間的總和,但最長未決時間,這是一個很大的優化。以多線程的方式解決這個問題是不可能的,因爲Javascript是單線程的,所以你需要異步等待答案,因爲請求不會等待服務器上的對方。如果您擁有服務器,那麼您不需要爲每個日期發送請求,但是要實現服務器端API函數,您將在其中處理日期範圍,因此客戶端將發送一個請求並等待回答。
看起來很有希望。我會仔細看看的。 :-) – blazs