ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用嵌套的 setTimeout 值得吗?

2022-09-01 11:01:34  阅读:206  来源: 互联网

标签:值得 执行 函数 嵌套 func setTimeout 1000


使用嵌套的 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

标签:值得,执行,函数,嵌套,func,setTimeout,1000
来源: https://www.cnblogs.com/amboke/p/16645753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有