使用嵌套的 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 版权协议,转载请附上原文出处链接和本声明