gpt4 book ai didi

javascript - 0ms setTimeout 之后是否需要clearTimeout?

转载 作者:数据小太阳 更新时间:2023-10-29 04:58:57 24 4
gpt4 key购买 nike

正如我已经了解到的(此处:https://www.youtube.com/watch?v=8aGhZQkoFbQ),在某些情况下调用具有 0 毫秒延迟的 setTimeout(由于事件循环)可能很有用。

现在通常每当我使用 setTimeout 时,我也会注意在适当的位置调用 clearTimeout 以确保没有任何东西留在某处并在我没有的地方执行想要它被执行。

所以我的问题是:是否有必要(是否有意义)在 setTimeout 之后调用 clearTimeout 0ms?传递的函数会立即附加到回调队列,因此我假设 clearTimeout 不会(也不能)做任何事情。或者 clearTimeout 甚至可以从回调队列中删除传递的函数(所以在超时到期之后但函数执行之前)?

第二个问题:即使它什么都不做,在这些情况下始终调用 clearTimeout 是否仍然是“最佳实践”?

最佳答案

Is it necessary (does it make sense) to call clearTimeout after a setTimeout with 0ms?

必要的如果目标是防止异步计时器回调运行。执行顺序可以完全根据调用回调的时间来讨论。

首先,0 毫秒的延迟值意味着“尽快运行回调”(从 future 的异步上下文),但是:

  1. 不会改变how setTimeout works ;和

  2. 0 is not the actual value used无论如何。

The passed function is immediately appended to the callback queue so I would assume clearTimeout does not (and cannot) do anything.

这是不正确的。传递的函数不是“立即附加到回调队列”。相反,超时到期并且计时器仍处于事件状态时,将调用回调函数。可能有其他异步回调 - 来自计时器或其他 - 可以在之前运行。

此外,所有剩余的同步代码都保证在计时器回调发生之前运行:在此上下文中清除超时可防止调用计时器回调,不考虑同步代码中花费的时间.

Even if it does not do anything, is it anyway 'best practice' to call clearTimeout always in those cases?

调用 clearTimeout 要么

  1. 如果在回调之前被清除(因为它删除了计时器),则阻止执行回调;

  2. 如果回调已经发生则什么都不做(因为计时器不再有效)

因此,代码/算法的正确运行需要清除计时器;或者这是一个无用的操作。创建一个定时器只是为了立即取消它可能毫无意义,但这是关于代码结构的题外话..

I also take care to call clearTimeout at the appropriate spot to make sure nothing remains somewhere and gets executed at a point where I do not want it to be executed.

如上所述,无需手动清除不再事件的计时器;并且在调用定时器回调之前取消定时器将删除定时器,从而阻止定时器回调的执行。

何时/何处/是否应该取消计时器取决于整个设计。


在执行代码中取消超时会阻止回调运行:“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);

在首先运行的异步事件中取消超时会阻止回调运行:“B”回调永远不会运行:。

a = setTimeout(function () { console.log("A"); clearTimeout(b); }, 0);
b = setTimeout(function () { console.log("B"); }, 0);

虽然使用了辅助计时器(因为顺序得到了很好的保证),但其他异步事件(按钮点击、网络 worker 、AJAX 等)也有可能在“0 毫秒”超时之前发生。

在回调(从任何上下文)之后调用的 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);

关于javascript - 0ms setTimeout 之后是否需要clearTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com