vscode 插件开发,做一个延迟操作。如何保证这个延迟尽可能精准?

2022-01-22 20:53:41 +08:00
 auh

vscode 插件开发,做一个延迟操作。如何保证这个延迟尽可能精准?

settimeout 能够延迟,但是延迟只是阈值。不是太准。

无意间发现,在注册 vscode 命令的时候,调用了 inputbox 。整个过程莫名其妙加速了。

貌似是其中各种调度处理机制自己调整的。

想问下大佬,如何解决?

2458 次点击
所在节点    Visual Studio Code
9 条回复
retrocode
2022-01-22 21:13:24 +08:00
任何延迟操作都不可能把时间控制的太精准吧,
我能想到的办法也就是是 settimeout 函数调用次数加快,然后执行的时候自己在根据时间戳二次判断了
sneezry
2022-01-23 00:53:21 +08:00
requestAnimationFrame?
wzzzx
2022-01-23 00:59:40 +08:00
或者你应该直接说一下你的需求?
auh
2022-01-23 06:03:56 +08:00
@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 中更加精准的延迟方式。
enki0423
2022-01-23 06:12:11 +08:00
@auh 所以为什么你需要等一会执行?任何依赖 timer 精度的设计都不合理
auh
2022-01-23 06:12:23 +08:00
复现方式:修改函数,返回 true.开启状态。https://github1s.com/fanlushuai/vscode-note-sync/blob/HEAD/src/note-sync.ts#L31-L32
f5 直接运行调试。
在调试窗口。打开输出日志,sync-note 那个。查看输出。
调用命令,syncQuickly 和 requireAction (呼出 inputbox 之后,可以直接回车)。查看日志输出表现。反应出来速度差异。
auh
2022-01-23 06:15:30 +08:00
@enki0423 没有为什么,因为宝宝想要。一共绑定了两个命令用于外部触发。但是也有 onsave 事件触发的逻辑。
onDidSaveTextDocument 触发,依赖于自己保存文件的操作。这个操作频率很高。想要降频。
kkocdko
2022-01-23 07:21:52 +08:00
一种思路:settings.json "files.autoSave": "afterDelay"
然后就不用自己防抖 /节流了,依赖 vscode 的 delay 就行
auh
2022-01-23 08:24:12 +08:00
@kkocdko 不过这样就和 autosave 绑定了。虽然想要绑定 save ,但是不期望绑定 auto 。

基于 vscode 自动延迟保存的方式,固定了频率,但是也出现一定会触发的频率。

想要一种既可以保持最低频率,但是不想要固定周期的效果。(因为固定周期会触发很多次 git 命令。)
目前的逻辑设计为,通过 ctrl+s 引发保存操作,且不会因为人为的高频 ctrl+s 操作,导致后续命令高频触发。同时延迟控制,需要两种模式,一种低速模式,在日常的编写过程中,一种是快速模式,当我想要关闭编辑器的时候,以及当我想要主动快速触发,push ,联动 github 上面的 workflow 。

目前的这个代码实现,已经满足这种逻辑。只是,在延迟上,遇到不精准的问题。能用但难受。

无意中发现 inputbox 的调用产生了缩小延迟的效果。使得我有了点优化延迟的期待。

目前,我的思路就是,搞清楚 inputbox 的加速核心关键。找找有没有哪些具备加速核心,并且是在后台执行的,并且没有啥影响的。方法调用存在。

这个加速关键个人猜测就是使得 nodejs 将 io 操作甩给了线程池了。无力研究。求教一下。

感谢老哥的思路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829974

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX