2016-11-09 77 views
0

是有可能實現的功能相當於setTimeout()在JavaScript?如果是的話,那麼最好的辦法是什麼?是否有可能在javascript中實現等效的setTimeout()?

function setTimeout(callback, time_in_ms) 
{ 
    // Implementation of time elapse of time_in_ms 
    callback(); 
} 

出於好奇,我在問這個問題。一個簡單的「不,這是不可能的」也將是一個足以回答這個問題。

+3

什麼?你爲什麼不使用現有的? – Liam

+4

不會有一個,除非你鎖定 – musefan

+3

的線程請解釋原因。聽起來像一個X/Y問題 – mplungjan

回答

5

我可以在JavaScript中自己實現setTimeout()嗎?

沒有 - 沒有一些其他本地異步API。你也許能夠實現它在setInterval而言,與網絡工作者,​​還是真的東西,在同一事件循環運行爲setTimeout會。但是,如果有阻止你使用內置setTimeout一個原因,可能還有其他的問題與您的環境 - 所以這取決於具體情況。

+1

爲什麼會有這些方法可用,如果'setTimeout'不是? – Cerbrus

+2

@Cerbrus我不知道,但我很想讓OP詳細說明他的情況:-) – Bergi

+1

考慮到OP提交問題後沒有顯示任何生命跡象,我懷疑我們永遠都知道。就個人而言,我寧願只是擺脫這個問題。就目前而言,它對於SO來說並沒有真正的價值。 – Cerbrus

1

的同步(非異步)setTimeout相當於將是這樣的:

function myTimeout(fun, milisecs) { 
 
    var nowT = Date.now(); 
 
    while(Date.now()< nowT+milisecs){ 
 
     continue; 
 
    } 
 
    fun(); 
 
} 
 
function consout() { 
 
    console.log('The future arrived now!'); 
 
} 
 

 
myTimeout(consout,2000);

然而,隨着Bergi mentioned你可能要一個異步API以避免拖延的JavaScript執行的瀏覽器。

一個Worker具有多線程功能,允許這樣做,與功能,如myWorker.port.start()myWorker.terminate() ...我從來沒有需要創建與工人或類似的API的東西,但也許你可以一點點研究多在這一領域(如果是這樣的話,我也不應該完成你的功課)。

+2

該代碼是「[Busy waiting](https://en.wikipedia.org/wiki/Busy_waiting)」實現。這是一個非常糟糕的主意,因爲它會阻止運行中的其他任何東西。基本上,這不是一個超時,而是一個接受回調的「wait」函數。 – Cerbrus

+0

感謝鏈接@Cerbrus。我知道旋轉,這就是爲什麼我提到同步這樣做會拖慢瀏覽器的JavaScript執行情況......正如你所提到的,這通常是一個非常糟糕的主意。 – CPHPython

+0

這是一個非常聰明的解決方案..我喜歡現在如何與日期混合來生成一個psuedo'setTimeout()'。我不確定其他解決方案,但這可能是OP尋找的答案。 –

相關問題