使用嵌套的 setTimeout 值得吗?

使用嵌套的 setTimeout 值得吗?

有许多服务需要在某个定义的时间之后或在定义的时间间隔内执行。为了在一段时间后运行某些功能,我们使用 setTimeout 获取在定义时间之后执行的一些代码 .为了在一定的时间间隔后运行某些功能,我们通常使用 设置间隔, 它需要一些在每个定义的时间后执行的代码。 但是这里在使用 setInterval 时存在一些问题。让我们来探索一下。

 常量函数 = () => {  
 活动A; //进行耗时的同步计算  
 活动 B; //进行耗时的同步计算  
 }  
 设置间隔(函数,1000);

假设有一个函数 fun 需要在每 1000 毫秒后调用一次,浏览器中的计时器线程开始倒计时,当时间到时,将回调函数(在我们的例子中是 func)放入 javascript 线程的执行堆栈中。为了更好地理解,我们将及时分解我们的执行。

在 T=0 秒(最初):我们的堆栈中有函数 func ,附加的计时器为 1 秒。

在 T=1 秒时:堆栈中的函数弹出并开始执行。同时,函数 func 再次以 1 秒的计时器压入堆栈。

现在出现了两种情况,

情况1:函数体在1秒内执行。

这种情况是正常的,代码会按预期运行。

情况2:函数体执行时间超过1秒。

在这种情况下,引擎会等待函数 func 完成,然后检查调度程序并在时间到时立即运行它。在极端情况下,如果函数 func 的执行时间总是超过 1000 毫秒,那么调用将不会暂停。

Function calls for setInterval

注意:对 setInterval 的 func 调用之间的实际延迟小于代码中的延迟!

现在,解决这个问题的方法是什么?我们可以用 嵌套的 setTimeout。 让我告诉你怎么做。

 常量函数 = () => {  
 活动A; //进行耗时的同步计算  
 活动 B; //进行耗时的同步计算  
 设置超时(函数,1000);  
 }  
 设置超时(函数,1000);

同样,我们将及时分解我们的执行。

在 T=0 秒(最初):我们的堆栈中有函数 func ,附加的计时器为 1 秒。

在 T=1 秒:我们堆栈中的函数弹出并开始执行,现在在 Activity A 和 B 完成之后(假设它需要 x 秒)

在 T= (1+x) 秒:现在 setTimeout 执行,它再次将函数 func 推入堆栈,附加的计时器为 1 秒。

同样,在 ((1+x )+ (1)) 秒之后,函数 func 再次开始执行,然后继续。

Function calls for setTimeout

如果你注意到什么, 嵌套的 setTimeout 保证了函数执行的固定延迟(这里是 1s)。

使用嵌套的 setTimeout 而不是 setTimeout 有更多好处,因为 嵌套的 setTimeout 更灵活 因为我们可以根据我们的要求安排下一次通话。让我们看看如何。

 延迟 = 1000;  
 常量函数 = () => {  
 活动A; //进行耗时的同步计算  
 活动 B; //进行耗时的同步计算  
 延迟 += 1000;  
 设置超时(函数,延迟);  
 }  
 设置超时(函数,1000);

从上面的代码中,函数的执行发生在等差数列中,公差为 1000 毫秒,起始值为 1000 毫秒。

用法:

例如:例如,如果我们需要编写一个服务,它每 8 秒向服务器发送一次请求以获取数据,但是如果服务器过载,则应该将间隔增加到 8、16 或 24 秒……

例如:如果我们正在调度的函数是 CPU 密集型的,那么我们可以测量执行所花费的时间并计划迟早的下一次调用。

如果您正在考虑在您的代码段中使用 setInterval,请停下来考虑一下我们是否可以使用嵌套的 setTimeout。 还是值得的。

欲了解更多信息:

领英: https://www.linkedin.com/in/shivam-agrawal-a4a414181/

GitHub: https://github.com/shivam1192

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/7838/51260110

posted @ 2022-09-01 10:53  哈哈哈来了啊啊啊  阅读(966)  评论(0编辑  收藏  举报