2010-01-13 78 views
5

嗯,首先我想說我在互聯網開發的世界有點新。javascript parallelism

無論如何,我想知道是否有可能使用javascript並行運行兩段代碼。

我真正需要的是調用遠程服務器中的兩個方法。我傳遞了一個回調函數,這個函數很快就會執行,我想要的數據已經準備就緒。由於運行這些功能的服務器需要一段時間來回答,因此我試圖找到一種同時調用這兩種方法的方法,而無需等到第一次完成時調用第二個方法。

確實喜歡的setTimeout方法同時運行,例如

setTimeout(func1, 0); 
setTimeout(func2, 0); 

...

function func1() 
{ 
    webMethod1(function() {alert("function 1 returned"); }); 
} 

function func1() 
{ 
    webMethod2(function() {alert("function 2 returned"); }); 
} 

編輯

我剛剛發現這篇文章可能是非常酷下一個瀏覽器的釋放:Javascript web workers

+0

我不知道正在調用超時功能,而其他代碼仍在運行。你可以很容易地測試它。 – 2010-01-13 14:31:34

+0

是的,問題在於,在我的原始代碼中,我需要檢查很多依賴性,然後纔將其更改爲以這種方式實現,並且我只想在值得的情況下執行所有這些工作。 – Andres 2010-01-13 14:33:56

回答

7

有一個單線程在Javascript中正常WebBrowsers執行:您的計時器處理程序將被串行調用。如果您使用計時器,您的方法將適用於您的情況。

有一個nice piece of documentation on timers由John Resig的(非常流行的jQuery JavaScript框架的作者 - 如果你是新的Web開發,我建議你看看它)。

現在,如果您指的是基於HTML5的瀏覽器,那麼在某些時候,它們應該具有線程支持。

+0

+1。雖然他們會被串行調用,但我想補充一下,OP對'webMethod'的使用意味着他真正希望避免的是同步等待兩個不同的Web請求,並且可以通過AJAX避免。 – 2010-01-13 14:34:09

+0

@David:我們可以注意到,在瀏覽器中,通常可以有至少2個連接到並行活動的原始服務器,這使得AJAX調用成爲並行化的有效工具。 – jldupont 2010-01-13 15:06:25

+0

偉大的文章.. – Andres 2010-01-13 16:31:12

-2

這取決於JavaScript引擎。

+0

編號JavaScript在所有瀏覽器中都是單線程的,而OP則詢問JavaScript在瀏覽器中運行。 – 2010-01-16 00:53:22

2

是的,這正是通過AJAX的Web請求的工作方式。不需要setTimeout爲0,你可以直接調用它們,併發出一個AJAX請求,它將被異步執行,允許你傳遞一個回調函數在請求完成時被調用。

創建AJAX請求的方法根據您運行的瀏覽器而有所不同。如果你打算建立一些依賴於AJAX的東西,並且你希望它可以在多個瀏覽器上運行,那麼你最好使用一個庫。下面是它是如何在jQuery中進行,例如:

$.ajax({ url: '/webrequesturl', success: function(result) { 
    // this will be called upon a successful request 
} }); 
$.ajax({ url: '/webrequest2url', success: function(result) { 
    // this will be called upon a successful request 
    // this may or may not be called before the above one, depending on how long it takes for the requests to finish. 
} }); 
2

嗯,JavaScript是單線程,這兩個計時器會按順序運行一前一後,即使你不會注意到它。

我會建議你給看看下面的文章,它確實說明了如何定時器和異步事件的工作,它也將幫助你理解JavaScript的單線程性質:

作爲一種替代方法,您可以查看WebWorkers,它是一種在單獨的後臺線程中運行腳本的方法,但它們僅受現代瀏覽器支持。

0

你在找什麼是異步客戶端 - 服務器通信(關鍵字:異步)。異步函數馬上返回,但提供的回調將在指定的條件滿足後執行。

因此,如果向服務器發送請求的功能是異步的,那麼這會讓您將兩個請求都發送到服務器,而無需等待響應。

使用setTimeout可能會工作,因爲這將調度兩個請求發送函數被調用。但是,某些瀏覽器一次只能運行一個Javascript線程,因此結果將是其中一個計劃函數將運行並阻塞(等待答覆),另一個計劃函數將一直等到第一個完成時纔開始運行。

建議從服務器通信庫使用異步支持。例如,jQuery默認使用異步。

相關問題