not*_*ng9 7 javascript settimeout
正如我已经了解的那样(这里:https://www.youtube.com/watch?v = 8aGhZQkoFbQ),在某些情况下,调用setTimeout时延迟0ms(因为事件循环)会很有用.
现在,每当我使用时,setTimeout
我也会小心地clearTimeout
在适当的位置打电话,以确保没有任何东西留在某处,并在我不希望它被执行的地方执行.
所以我的问题是:clearTimeout
在setTimeout
0ms 之后打电话是否有必要(有意义吗?)传递的函数会立即附加到回调队列中,因此我认为clearTimeout
不会(也不能)执行任何操作.或者clearTimeout
甚至可以从回调队列中删除传递的函数(因此在超时到期之后但在函数执行之前)?
第二个问题:即使它没有做任何事情,clearTimeout
在这些情况下总是要求"最佳做法" 吗?
use*_*740 12
在具有0ms的setTimeout之后调用clearTimeout是否有必要(是否有意义)?
如果目标是阻止异步计时器回调运行,则是必要的.可以根据何时调用回调来完全讨论执行顺序.
首先,作为延迟的0毫秒值意味着"尽快运行回调"(来自未来的异步上下文),但是:
它并没有改变如何setTimeout的作品 ; 和
传递的函数会立即附加到回调队列中,因此我认为clearTimeout不会(也不能)执行任何操作.
这是不正确的.传递的函数不会 "立即附加到回调队列".相反,当超时到期且计时器仍处于活动状态时,将调用回调函数.可能有其他异步回调 - 来自定时器或其他 - 可以在之前运行.
此外,保证所有剩余的同步代码在定时器回调发生之前运行:在此上下文中清除超时可防止定时器回调被调用,无论同步代码中花费的时间如何.
即使它没有做任何事情,无论如何,总是在这些情况下调用clearTimeout是"最佳做法"吗?
调用clearTimeout也可以
如果在回调之前清除(因为它移除了定时器),则阻止回调执行;或者;
如果回调已经发生,则不执行任何操作(因为计时器不再处于活动状态)
因此,为了正确运行代码/算法,需要清除定时器; 或者这是一个无用的操作.创建一个计时器只是为了立即取消它可能毫无意义,但这是一个关于代码结构的题外话.
我还要注意在适当的位置调用clearTimeout以确保没有任何东西留在某处并在我不希望它被执行的位置执行.
如上所述,不需要手动清除不再活动的计时器; 并且在调用定时器回调之前取消定时器将移除定时器,从而防止定时器回调执行.
何时/何时/如果取消定时器取决于整个设计.
取消执行代码中的超时可防止回调运行:"A"或"B"回调都不会运行.
a = setTimeout(function () { console.log("A"); }, 0);
clearTimeout(a);
b = setTimeout(function () { console.log("B"); }, 0);
s = Date.now()
while (Date.now() - s < 100) { /* waste 100ms of CPU */ }
clearTimeout(b);
Run Code Online (Sandbox Code Playgroud)
在首先运行的异步事件中取消超时会阻止回调运行:"B"回调永远不会运行:
a = setTimeout(function () { console.log("A"); clearTimeout(b); }, 0);
b = setTimeout(function () { console.log("B"); }, 0);
Run Code Online (Sandbox Code Playgroud)
虽然使用了辅助计时器(因为订购得到很好的保证),但在"0ms"超时之前,也有可能发生其他异步事件(按钮点击,Web工作者,AJAX等).
回调后(来自任何上下文)调用的clearTimeout无用:
a = setTimeout(function () { console.log("A"); clearTimeout(a); }, 0);
a = setTimeout(function () { console.log("A"); }, 0);
b = setTimeout(function () { console.log("B"); clearTimeout(a); }, 0);
Run Code Online (Sandbox Code Playgroud)
clearTimeout
将删除该功能。在 Chrome 控制台中试试这个:
var timer = setTimeout(function() { console.log('hello'); }, 0);
clearTimeout(timer);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4549 次 |
最近记录: |