2017-08-25 151 views
0

我希望能夠在setInterval剩下時間的情況下運行代碼。setInterval JavaScript的剩餘時間

let car = setInterval(function() { 
    // stuff 
    }, 2000); 

    let vehicle = setInterval(function() { 
    train() 
    }, 1000); 

    function train() { 
    // stuff 
    // and if car has time left, do this stuff too. 
    } 

在列車函數的最後一行,我要檢查汽車的剩餘時間,但不知道如何去了解這樣一個概念。 我想知道剩下的確切時間,或者簡單地說,剩下的時間對我來說是一樣的,所以哪個更容易。

+1

而不是擔心時間的具體細節,您可以分配/綁定事件,以通知觀察者行動何時完成...... – Pineda

回答

1

這是不可能的。定時器實際上是在JavaScript運行時之外執行的,它們中指定的時間永遠不會是一個精確的度量 - 它實際上是定時器可以運行的最短時間。實際的時間長短取決於JavaScript運行時的繁忙程度,以及運行時在定時器超時時是否處於空閒狀態,可以運行定時器的回調函數。

因此,實際上,您必須計算JavaScript執行堆棧需要多長時間才能變爲空閒狀態,這是您無法做到的,因爲要獲得時間度量,您必須執行剩餘的碼。所以,在沒有剩下時間之前,你無法得到答案。

但是,根據您的代碼,似乎您可以設置一個簡單的「標誌」變量,在car運行時設置。因此,在train內部,您可以檢查該標誌是否已設置,如果沒有,請運行train代碼,然後重置該標誌。

0

請記住,定時器可能相當不精確,並且setInterval的規則是......有趣......如果您的處理程序在下一個時間間隔開始時運行過去了。記住這一點非常重要。

但如果你的目標是要知道它是多久以前的調用計時器時,計時器將被設置爲再次觸發VS的開始,這是當你開始

var start = Date.now(); 
記住的事

...然後稍後檢查它相對於間隔的時間。例如:

if (Date.now() - start >= 1900) { 
    // It's been at least 1900ms since the start of the `vehicle` call, 
    // so based on a 2000ms interval, in theory you have only 100ms left 
} 

,再次,注意計時器可以說是相當不準確的,如果其他的東西都保持UI線程繁忙。

+0

*(如果您沒有看到上面的「> = 1900」,請點擊刷新。 )* –