2015-12-18 178 views
1

我想要代碼只需每秒鐘計數一次左右。不過,我也希望能夠在旁邊運行其他代碼。HTML/JavaScript:如何在運行其他代碼時運行循環?

例子:

while(true){ 
Number + 1 + OtherNumber = Number 
} 

而且還能夠在同一時間運行此:

function onButtonPress() { 
OtherNumber++ 
} 

注:我不想在間隔遞增otherNumber,而是對新聞界的按鈕。

回答

2

您可以使用setInterval

var intervalId = setInterval(function() { 
    OtherNumber++; 
}, 1000); 

它將由一個大約每秒增加OtherNumber

setInterval收益區間的ID,可以用來阻止它:

clearInterval(intervalId); 

演示片斷

document.body.innerHTML += "Start<br/>"; 
 

 
setInterval(function() { 
 
    document.body.innerHTML += "Interval step<br/>"; 
 
}, 1000); 
 

 
document.body.innerHTML += "Look! Code is completed before interval step<br/>";

+0

當存在無限循環時'setInterval'將不起作用。 'while(true){}'將會阻止所有的事件,包括'setInterval',這將簡單地保持將調用推到調用堆棧上,直到它溢出。 – Blindman67

+0

@ Blindman67當然。 'setInterval'本身就是一個無限循環,它應該替換'while'的使用而不會導致性能問題。 –

+1

如果我按照自己的方式,'setInterval'將完全從Javascript標準中刪除,因爲它對'setTimeout'沒有額外的改進,但是具有推入調用堆棧的可怕屬性,而不考慮代碼服務事件的能力它產生。它被廣泛誤解並且幾乎總是被濫用。 – Blindman67

0

如果你想運行代碼兩個單獨的線程,你將不得不使用Web Workers作爲Javascript是單一的並且一次不能運行多個功能。

如果創建了一個功能

function workForever(){ 
    while(true){ 
     .. do work 
    } 
} 

你會完全阻止所有代碼,沒有事件將被調用,並沒有其他JavaScript將被執行。大多數瀏覽器都會拋出一個對話框報告一個函數需要很長時間才能殺死該頁面。但是你的代碼被卡在循環中,只能從循環內退出。

WebWorkers是Javascript環境中多任務的一個很好的解決方案,但您仍然需要提供一些非執行時間來允許webworkers進行通信。 while(true)將阻止與工作人員的所有溝通,實際上使他們無用。

SetInterval,setTimeout,​​也將被阻止。不幸的是,Javascript是單線程的,並且永遠不能同時運行兩個函數。

+0

這正是我需要的,謝謝你的幫助。 – Nachtara