2013-05-30 17 views
0

我對Javascript中的定時器有點困惑。 我一直在玩定時器。關於Javascript中定時器的混淆問題

我對異步事件中的排隊過程如何發生困惑。 我已閱讀關於異步事件如何排隊的文章。 但是我發現很難繞過排隊過程。

下面的代碼:

http://jsbin.com/iwahuf/2/edit

在我已經發布將計時器按順序queud的代碼。事件隊列中的定時器不會執行FIFO(先入先出)。

以下是我在活動隊列中記住的內容。

  1. 第一定時器W/500ms的延遲
  2. 秒計時器W/600毫秒延遲
  3. 第三定時器W/300ms的延遲
  4. 四定時器W/400ms的延遲

在我看來,由於第一個計時器是第一個在事件隊列中註冊的計時器,它將是第一個被執行的計時器,並且只有在500毫秒後第二個計時器纔會被執行,依此類推。

請在這個問題上給我啓發。我是一個小混混。我認爲我對排隊過程的理解並不完全正確。

在此先感謝。

回答

2

註冊計時器不會停止您的代碼。您正在同時註冊所有計時器,計劃員將在註冊後的N ms後嘗試執行它們。

這意味着

  • 執行主代碼後,你設置的第三個定時器將首先被執行300毫秒
  • 那麼這將是第四個400毫秒被執行主代碼後
  • 那麼第一個和第二個

如果你想排隊你的計時器,或者你鏈接他們(通過使他們每個人都會調用下一個)或者(如果任務很短的話更輕更簡單)y你計算自己的時間:

var time = 0; 
setTimeout(function(){ 
    console.log("First Timer"); 
}, time += 500); 
setTimeout(function(){ 
    console.log("Second Timer"); 
}, time += 600); 
console.log("Executed immediately"); 
setTimeout(function(){ 
    console.log("Third Timer"); 
}, time += 300); 
setTimeout(function(){ 
    console.log("Fourth Timer"); 
}, time += 400); 

In this somewhat related answer我給一個簡單隊列的實現。

+0

沒錯。沒有「定時器隊列」。如果你想這樣做,你需要自己實現。即註冊第一個計時器內的第二個計時器會添加它們。 –

+0

感謝您的回覆。 我對你的陳述有些困惑,他們同時被執行。不是Javascript單線程,所以我認爲只有一個異步事件或計時器將被註冊在事件隊列中。 – chanHXC

+0

@chanHXC很好,不完全是同一時間,但JS速度足夠快,所以感覺就像是同一時間。 –

1

不,定時器不是先進先出的。

這不是被放在事件隊列中的計時器自己 - 當計時器到期,他們產生「計時器經過」被添加到FIFO事件隊列事件,因爲它們到期

計時器對象如何實際檢測到它們已過期並創建這些事件超出了範圍,並且可能取決於實施。

+0

我在這裏要糾正,所以這意味着定時器內的代碼/進程將被執行N延遲,如果代碼/進程被註冊到事件隊列中,除非瀏覽器可以自由執行一些東西。 – chanHXC

1

當在Javascript中設置超時時,它不會停止執行以下代碼。相反,它會延遲函數集的執行超時運行。爲了達到您的預期效果,您的代碼需要如下所示:

setTimeout(function(){ 
    console.log("First Timer"); 

    setTimeout(function(){ 
    console.log("Second Timer"); 

    setTimeout(function(){ 
     console.log("Third Timer"); 

     setTimeout(function(){ 
      console.log("Fourth Timer"); 
     }, 400); 

    }, 300); 

    }, 600); 

}, 500); 

console.log("Executed immediately"); 

希望這有助於您!

+0

感謝您的回覆。我想你是正確的。即使我仍然有點困惑, – chanHXC

+0

從您的意見中,我認爲您對計算機理論有足夠的理解,以便找到有用的文章:http://ejohn.org/blog/how-javascript-timers-work/ – Khior