VS Code扩展中onDidSaveTextDocument触发无限循环问题排查
问题分析:VS Code扩展保存时无限循环格式化的原因
问题描述
我正在开发一款VS Code扩展,旨在实现保存文件时依次运行两个格式化工具,思路来源于一则Stack Overflow回答。我的扩展代码如下:
import * as vscode from "vscode"; export function activate(context: vscode.ExtensionContext) { vscode.workspace.onDidSaveTextDocument(() => { vscode.window.showInformationMessage('Hello World from mojo.formatter!'); const config = vscode.workspace.getConfiguration( "editor", vscode.window.activeTextEditor?.document ); const formatters = ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]; formatters.forEach(async (formatter) => { await config.update("defaultFormatter", formatter); await vscode.commands.executeCommand("editor.action.formatDocument"); }); }); }
同时我在package.json中添加了以下配置:
"activationEvents": [ "*" ],
其余配置与Hello World扩展示例一致。但保存文档时,格式化工具虽能运行,却出现了保存→格式化→再次保存→再次格式化的无限循环,请问问题原因是什么?
问题原因
- 核心触发逻辑:
editor.action.formatDocument执行后会修改文档内容,若VS Code开启了自动保存相关配置(比如editor.formatOnSave或自动保存功能),文档修改后会自动触发保存操作,进而再次触发onDidSaveTextDocument事件,形成循环。 - 配置变更的额外影响:循环中修改
defaultFormatter配置,每次配置变更会触发VS Code的文档状态重新检测,可能间接触发格式化或保存逻辑,进一步强化循环条件。 - 异步执行的漏洞:
forEach中使用async/await无法实现顺序阻塞,两个格式化命令会并行触发,导致文档修改和保存事件更频繁地被触发,加重循环问题。
内容的提问来源于stack exchange,提问作者lpetrucci
相关产品推荐
相关产品推荐

