2016-09-24 38 views
1

我有一個Web應用程序必須執行以下任務。對於選定的日期範圍,它會向範圍中的每個日期的Web服務發出GET請求;這可能需要一段時間,並且因爲我想稍後可視化數據,所有調用都是同步的(每個請求的結果都存儲在一個數組中)。此檢索需要一段時間(幾秒鐘),這意味着主線程「凍結」。jQuery:在單獨的線程中檢索數據

什麼是避免這種情況的好方法? (例如,在單獨的線程中進行檢索並在完成後收到通知)。

回答

2

考慮使用promises。 它們使您能夠對API執行非阻塞調用。這基本上是你要求的。

編輯:您可以使用when()專門收到通知,當所有操作完成。

+0

看起來很有希望。我會仔細看看的。 :-) – blazs

1

您應該使您的GET請求異步,然後可視化所有請求完成。

var get1 = $get(.. 
var get2 = $get(.. 
var get3 = $get(.. 

$.when(get1, get2, get3).done(function (...) { 
    // do something with the response 
    visualize(); 
}); 
+0

有趣。在我的情況下,GET請求的數量實際上取決於GET請求(它返回一個日期範圍)。 – blazs

1

實際上有一個簡單的解決方案。讓我們實現一個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函數,您將在其中處理日期範圍,因此客戶端將發送一個請求並等待回答。