2017-08-12 125 views
0

圍繞Javascript的異步性質仍然包裝我的頭。幫助我理解這一點:我有幾個函數需要在數組中的項目上運行。JavaScript異步循環

我們有備選方案1:

for (f of files){ 
    do_a(f); 
    do_b(f); 
    do_c(f); 
} 

VS選項2:

for (f of files){ 
    do_a(f); 
} 

for (f of files){ 
    do_b(f); 
} 

for (f of files){ 
    do_c(f); 
} 
  1. 這將是更快?
  2. 在選項1中,即使do_a仍在工作,do_b函數是否會觸發?
  3. 在選項2中,即使do_a循環仍在工作,do_b循環會觸發嗎?
+1

Javascript是單線程的 - 意思是當另一個人仍在工作時功能不能觸發,除非另一個人中斷或暫時釋放控制權。如果對元素進行操作的功能不會相互干擾,則選項1會更好。特別是在文件上,緩存未命中可能發揮相當大的作用。 – ASDFGerte

+0

** 1。**我會說選項1,因爲你只循環一次。 ** 2。**是,如果'do_a'是異步的。 ** 3。**是的,如果'do_a'是異步的。 – blex

+0

除非函數本身是異步的,否則這個問題不是關於JavaScript的異步性質,而僅僅是性能。 – Andy

回答

1
  1. 目前尚不清楚

  2. 是,該函數將被稱爲

  3. 不,第一循環將第二循環開始前完成開始

+2

只是爲了澄清#3:循環將完成,但其中的'do_a'功能可能仍然在運行,如果它們是異步的 – blex

+0

由「它不清楚」我假設你的意思是這取決於功能的性質。 ..但是所有的東西都是相等的(可以說每個函數都需要T時間才能完成),每個取Tx1時間的3個循環會比取1個Tx3時間的循環快嗎? @blex – Trees4theForest

+1

這是一個如何構造模式的問題。即使這個調用是異步的,下一個循環也可以等待,直到第一個循環完成。 – guest271314

1
  1. 哪個會更快?

這很難說。

  1. 在選項1中,即使do_a仍在工作,do_b函數是否會觸發?

儘管Javascript支持異步編程,但您在此處展示的代碼完全是同步的,因此這些功能將按照您編寫的順序進行工作。

  1. 在選項2中,即使do_a循環仍在工作,do_b循環會觸發嗎?

不,出於同樣的原因。