2014-09-27 31 views
1

我的腳本運行如下:
是否可以在JavaScript中並排運行多個函數,即使它們沒有在同一時間觸發?

//Gets triggered when a button is clicked 
function button_1() { 
    ... 
    setTimeout(other_function(), 0); 
    ... 
} 

//Checks if for hundreds of thumbnails a high-res version is available 
function other_function() { 
    ... 
    $.ajax({ 
     url: url_to_highres_file, 
     type: 'HEAD', 
     cache: false, 
     error: function() { 
      $(#output).text('The file ' + filename_of_current_file + ' is not available!'); 
     } 
    }); 
    ... 
} 

據我所知,直到函數「other_function」時觸發功能「button_1」被觸發,執行代碼。從那時起,這兩個函數就同時運行。我現在的問題是,函數「other_function」運行很長時間。當該功能正在運行並且用戶觸發另一個功能時,例如「button_2」,那麼javascript在函數「button_2」內開始執行代碼之前首先完成「other_function」函數。

由於函數「other_function」對用戶沒有那麼高的優先級,所以網站更重要的是響應輸入,而不是先完成「other_function」函數。

有沒有一種方法可以從函數「other_function」中繼續執行代碼塊,還可以在函數「button_2」之間混合代碼塊,所以它們並排運行,用戶不必等到函數「other_function」已完成?

非常感謝您的幫助!

+0

我建議尋找webworkers,因爲它可以讓你的other_function代碼在一個單獨的進程中運行,並且同時運行。 JS在瀏覽器中是單線程的。所以雖然它的事件驅動而不是線性的,但它仍然只能一次執行一個函數。工人通過開始一個新的獨立線程來解決這個問題。 – Brian 2014-09-27 05:20:25

+0

謝謝Brian。我感謝您的意見! – ITinfrastructure 2014-09-27 05:28:17

回答

2

有三種可能的方式來處理它,具體取決於您的意思是「並排」。如果你正在談論實際上執行代碼,它可以只有可以通過多線程來實現,因爲你可以想象代碼就像一個文字線程穿過CPU,傳統上也被稱爲「磁帶」(因爲這就是它使用的成爲 )。

同時處理的唯一方法是使用多個線程,多個CPU核心而不是一個。這種方式即使一個線程花了很長時間(它阻塞),其他線程仍在處理中。另一個優點是兩個線程的處理速度實際上快了一倍,因爲您使用的處理能力是雙倍(或更多,取決於您可以使用多少個線程)。

由於設計簡單,Javascript沒有多線程支持。如果您爲瀏覽器編寫Javascript,您的唯一選擇是使用Web Workers API,nodejs在標準庫中具有非常類似的Cluster API以及框架。

第二種方法被稱爲「子程序」,其中不是完成整個昂貴的計算,而是將其分割成許多小塊並在每個塊之後返回控制,因此可以進行其他計算(例如處理事件)在這些塊之間。

第三,「異步」方法與您的問題無關。我只是提到它,因爲這是許多非常類似的問題的最佳方法。人們往往只是想讓功能「等待某些東西」,而不是一起進行多個計算。這是一個完全不同的話題,但卻是一個非常受歡迎的話題。

+0

謝謝Winchestro!我會研究網絡工作者。 – ITinfrastructure 2014-09-27 05:28:55

+0

@Flimzy感謝您花時間回顧這個1歲的答案,它確實可以使用一些改進/澄清。我沒有說你批評它的東西,但這意味着我的答案一定是令人困惑的。所以我想盡量減少混淆。 – Winchestro 2015-08-25 15:00:52

+0

現在更清楚了。如果我誤解了我的道歉,但是謝謝你提供的答案也一樣。 – Flimzy 2015-08-25 18:38:33

相關問題