vscode 插件开发,做一个延迟操作。如何保证这个延迟尽可能精准?
settimeout 能够延迟,但是延迟只是阈值。不是太准。
无意间发现,在注册 vscode 命令的时候,调用了 inputbox 。整个过程莫名其妙加速了。
貌似是其中各种调度处理机制自己调整的。
想问下大佬,如何解决?
1
retrocode 2022-01-22 21:13:24 +08:00
任何延迟操作都不可能把时间控制的太精准吧,
我能想到的办法也就是是 settimeout 函数调用次数加快,然后执行的时候自己在根据时间戳二次判断了 |
2
sneezry 2022-01-23 00:53:21 +08:00
requestAnimationFrame?
|
3
wzzzx 2022-01-23 00:59:40 +08:00
或者你应该直接说一下你的需求?
|
4
auh OP @wzzzx 功能就是通过 vscode 快捷键触发,git 命令执行。但是要求不是立刻执行。而是等一会再执行。
https://github1s.com/fanlushuai/vscode-note-sync/blob/HEAD/src/extension.ts#L39-L40 https://github.com/fanlushuai/vscode-note-sync/blob/37dc236c5ab069e5c104e8bcc82b62a51c56e34f/src/extension.ts#L45 这两条 vscode 注册命令内部执行了相同的操作。但是执行速度表现快的,调用了 inputbox 。 发现这个现象之后,因为这种快导致了延迟更低了。所以,我想获得一个稳定的快。但是不期望调用 inputbox 。 看看有没有什么方式,加上一些触发代码。使得其稳定存在。 或者有其他在 vscode 中更加精准的延迟方式。 |
6
auh OP 复现方式:修改函数,返回 true.开启状态。https://github1s.com/fanlushuai/vscode-note-sync/blob/HEAD/src/note-sync.ts#L31-L32
f5 直接运行调试。 在调试窗口。打开输出日志,sync-note 那个。查看输出。 调用命令,syncQuickly 和 requireAction (呼出 inputbox 之后,可以直接回车)。查看日志输出表现。反应出来速度差异。 |
7
auh OP @enki0423 没有为什么,因为宝宝想要。一共绑定了两个命令用于外部触发。但是也有 onsave 事件触发的逻辑。
onDidSaveTextDocument 触发,依赖于自己保存文件的操作。这个操作频率很高。想要降频。 |
8
kkocdko 2022-01-23 07:21:52 +08:00
一种思路:settings.json "files.autoSave": "afterDelay"
然后就不用自己防抖 /节流了,依赖 vscode 的 delay 就行 |
9
auh OP @kkocdko 不过这样就和 autosave 绑定了。虽然想要绑定 save ,但是不期望绑定 auto 。
基于 vscode 自动延迟保存的方式,固定了频率,但是也出现一定会触发的频率。 想要一种既可以保持最低频率,但是不想要固定周期的效果。(因为固定周期会触发很多次 git 命令。) 目前的逻辑设计为,通过 ctrl+s 引发保存操作,且不会因为人为的高频 ctrl+s 操作,导致后续命令高频触发。同时延迟控制,需要两种模式,一种低速模式,在日常的编写过程中,一种是快速模式,当我想要关闭编辑器的时候,以及当我想要主动快速触发,push ,联动 github 上面的 workflow 。 目前的这个代码实现,已经满足这种逻辑。只是,在延迟上,遇到不精准的问题。能用但难受。 无意中发现 inputbox 的调用产生了缩小延迟的效果。使得我有了点优化延迟的期待。 目前,我的思路就是,搞清楚 inputbox 的加速核心关键。找找有没有哪些具备加速核心,并且是在后台执行的,并且没有啥影响的。方法调用存在。 这个加速关键个人猜测就是使得 nodejs 将 io 操作甩给了线程池了。无力研究。求教一下。 感谢老哥的思路。 |