如何等待Monaco Editor的JSON验证完成?
Monaco Editor 等待JSON验证完成的正确方式
完全可以通过直接获取JSON Worker来精准等待验证完成,避开onDidChangeModelContent的延迟问题和onDidChangeModelDecorations的频繁触发问题。具体操作如下:
核心思路
JSON验证是在独立的Worker线程中执行的,直接调用Worker提供的验证方法,就能拿到最新、最准确的验证结果,无需依赖编辑器的装饰或内容变更事件。
代码实现
- 获取目标模型
先拿到你要监听的JSON模型实例:
const model = monaco.editor.getModel(monaco.Uri.parse('inmemory://model.json'));
(这里的URI要和你创建编辑器时传入的一致)
- 获取JSON Worker并监听验证结果
通过getJSONWorker()获取Worker实例,然后在内容变化时调用Worker的doValidation方法,等待验证完成:
// 获取JSON Worker monaco.languages.json.getJSONWorker().then(worker => { // 监听模型内容变化 model.onDidChangeContent(() => { // 调用Worker的验证方法,等待返回最新诊断结果 worker.doValidation(model.uri).then(diagnostics => { // diagnostics就是最新的验证结果数组,包含错误、警告等信息 // 这里写你验证完成后的逻辑,比如更新错误提示、执行后续操作 console.log('验证完成,结果:', diagnostics); }); }); });
为什么这个方法靠谱
doValidation是直接请求JSON Worker执行验证,返回的结果是实时且完整的,不会有延迟导致的旧数据问题。- 只会在内容变更时触发验证请求,不会像
onDidChangeModelDecorations那样因为光标移动、选中内容等无关操作触发。
如果怕频繁修改导致重复请求,可以给onDidChangeContent加个防抖,比如用setTimeout控制请求频率,避免Worker压力过大。
内容的提问来源于stack exchange,提问作者linjunchao
相关产品推荐
相关产品推荐

