V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
auh
V2EX  ›  Visual Studio Code

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

  •  
  •   auh · 2022-01-22 20:53:41 +08:00 · 2511 次点击
    这是一个创建于 1070 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    想问下大佬,如何解决?

    9 条回复    2022-01-23 08:24:12 +08:00
    retrocode
        1
    retrocode  
       2022-01-22 21:13:24 +08:00
    任何延迟操作都不可能把时间控制的太精准吧,
    我能想到的办法也就是是 settimeout 函数调用次数加快,然后执行的时候自己在根据时间戳二次判断了
    sneezry
        2
    sneezry  
       2022-01-23 00:53:21 +08:00
    requestAnimationFrame?
    wzzzx
        3
    wzzzx  
       2022-01-23 00:59:40 +08:00
    或者你应该直接说一下你的需求?
    auh
        4
    auh  
    OP
       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
        5
    enki0423  
       2022-01-23 06:12:11 +08:00 via iPhone
    @auh 所以为什么你需要等一会执行?任何依赖 timer 精度的设计都不合理
    auh
        6
    auh  
    OP
       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
        7
    auh  
    OP
       2022-01-23 06:15:30 +08:00
    @enki0423 没有为什么,因为宝宝想要。一共绑定了两个命令用于外部触发。但是也有 onsave 事件触发的逻辑。
    onDidSaveTextDocument 触发,依赖于自己保存文件的操作。这个操作频率很高。想要降频。
    kkocdko
        8
    kkocdko  
       2022-01-23 07:21:52 +08:00
    一种思路:settings.json "files.autoSave": "afterDelay"
    然后就不用自己防抖 /节流了,依赖 vscode 的 delay 就行
    auh
        9
    auh  
    OP
       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 操作甩给了线程池了。无力研究。求教一下。

    感谢老哥的思路。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2672 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:54 · PVG 09:54 · LAX 17:54 · JFK 20:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.