测试 #199023可能是终端代码中的问题,或者与我们在 setTimeout / setInterval 周围尝试的一些技巧有关?
setTimeout
setInterval
bxfogqkk1#
我们现在已经安排了setTimeout在每个打开的窗口上运行,但一旦第一个运行(甚至在触发回调之前),我们就会立即取消所有其他超时。如果定时器运行超过一次,我会感到惊讶。我们甚至有一个额外的实用方法来确保回调只运行一次:vscode/src/vs/workbench/browser/window.ts第68行到第71行的2e721b6| | consthandlerFn=createSingleCallFunction(handler,()=>{ || | dispose(timeoutDisposables); || | BaseWindow.TIMEOUT_DISPOSABLES.delete(timeoutHandle); || | }); |
krcsximq2#
顺便说一下,我无法复现这个问题。
c3frrgcw3#
感谢您的提示,我会进行调查。
os8fio9y4#
在终端领域,我注意到有很多 getActiveWindow 的使用。作为 #199568 的一部分,我已经将一些终端代码切换为使用 mainWindow ,特别是在 setTimeout 和 clearTimeout 同时使用的情况下。我认为在这些情况下路由到活动窗口是危险的,因为一个窗口上可能安装了一个计时器,然后尝试在另一个窗口上清除它,这是不起作用的。通过 mainWindow 可以确保一切都得到妥善处理和分发。然而,我仍然发现有些一次性间隔被安排在活动窗口上,并想知道我们是否可以尝试选择正确的窗口来确定终端的位置。
getActiveWindow
mainWindow
clearTimeout
tl;dr;:避免在可以基于正在构建的 DOM 节点推断正确上下文的情况下使用 getActiveWindow 或 getActiveDocument。
getActiveDocument
ivqmmu1c5#
无法再复制
svgewumm6#
刚刚看到它发生了,但不确定是否可以复现。
6条答案
按热度按时间bxfogqkk1#
我们现在已经安排了
setTimeout
在每个打开的窗口上运行,但一旦第一个运行(甚至在触发回调之前),我们就会立即取消所有其他超时。如果定时器运行超过一次,我会感到惊讶。我们甚至有一个额外的实用方法来确保回调只运行一次:vscode/src/vs/workbench/browser/window.ts
第68行到第71行的2e721b6
| | consthandlerFn=createSingleCallFunction(handler,()=>{ |
| | dispose(timeoutDisposables); |
| | BaseWindow.TIMEOUT_DISPOSABLES.delete(timeoutHandle); |
| | }); |
krcsximq2#
顺便说一下,我无法复现这个问题。
c3frrgcw3#
感谢您的提示,我会进行调查。
os8fio9y4#
在终端领域,我注意到有很多
getActiveWindow
的使用。作为 #199568 的一部分,我已经将一些终端代码切换为使用mainWindow
,特别是在setTimeout
和clearTimeout
同时使用的情况下。我认为在这些情况下路由到活动窗口是危险的,因为一个窗口上可能安装了一个计时器,然后尝试在另一个窗口上清除它,这是不起作用的。通过mainWindow
可以确保一切都得到妥善处理和分发。然而,我仍然发现有些一次性间隔被安排在活动窗口上,并想知道我们是否可以尝试选择正确的窗口来确定终端的位置。
tl;dr;:避免在可以基于正在构建的 DOM 节点推断正确上下文的情况下使用
getActiveWindow
或getActiveDocument
。ivqmmu1c5#
无法再复制
svgewumm6#
刚刚看到它发生了,但不确定是否可以复现。