在递归函数中使用Javascript计时器时是否释放了它们?
我遇到了下面的代码,其中递归调用在递归函数中使用Javascript计时器时是否释放了它们?,javascript,recursion,settimeout,Javascript,Recursion,Settimeout,我遇到了下面的代码,其中递归调用setTimeout,直到window。value不可为空: const process = () => { return new Promise(resolve => { (function checkScriptParsed(self) { self.timer = window.setTimeout(() => { if (window.value) { clearTimeout(
setTimeout
,直到window。value
不可为空:
const process = () => {
return new Promise(resolve => {
(function checkScriptParsed(self) {
self.timer = window.setTimeout(() => {
if (window.value) {
clearTimeout(self.timer);
resolve();
} else {
checkScriptParsed(self);
}
}, 50);
})({});
});
};
我的问题是,如果
window.value
在00:00:00后50毫秒不可为空,并且每毫秒生成一个计时器,那么在00:00:00后50毫秒是否会有49个活动计时器运行?否,一次只有一个计时器处于活动状态,因为setTimeout
是一次性的:与setInterval
不同,它不会再次启动自身。事实上,这条线
clearTimeout(self.timer);
这是垃圾,因为当调用计时器时,计时器已经完成,不需要清理
该代码似乎是一个过于复杂的版本,类似于
const process = () => {
return new Promise(resolve => {
const timer = setInterval( () => {
if (window.value) {
clearInterval(timer);
resolve();
}
}, 50);
});
};
即便如此,异步加载脚本上的
加载事件处理程序可能是检测脚本是否已被解析的更好方法。不,一次只有一个计时器。这段代码每50秒检查一次解析的脚本。如果是1ms,那么每1ms就有一个计时器。重要的是50ms是函数调用之间的空闲时间。函数执行时间也会增加。此外,几乎总是有更好的方法等待变量。您可能应该首先添加为什么要使用该代码。