2016-11-09 74 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寻找的答案。 –

相关问题