如何以编程方式关闭 vscode.window 的 showInformationMessage 框

How to programmatically close vscode.window's showInformationMessage box

我刚开始学习 vscode 扩展,我想知道是否有一种简单的方法可以通过编程关闭通过 vscode.window.showInformationMessage() 生成的信息消息框。如果你想重现,我从 WordCount demo here 开始,在 extension.ts 的正文 copy/pasting 之后,如教程中所述,我对 activate() 进行了一些修改,如下所示...

export function activate(context: ExtensionContext) {
    let wordCounter = new WordCounter();
    let wcTimeout = null;
    let setWCTimeout = function() {
        clearWCTimeout();
        wcTimeout = setTimeout(clearWCTimeout, 1000);
    };
    let clearWCTimeout = function() {
        if (wcTimeout !== null) {
            clearTimeout(wcTimeout);
            wcTimeout = null;
            // clear/hide the message box here, but how?
        }
    };

    let disposable = commands.registerCommand('extension.sayHello', () => {
        wordCounter.updateWordCount();
        setWCTimeout();
        vscode.window
            .showInformationMessage(wordCounter._getWordCount(window.activeTextEditor.document).toString())
            .then(clearWCTimeout);
    });

    // Add to a list of disposables which are disposed when this extension is deactivated.
    context.subscriptions.push(wordCounter);
    context.subscriptions.push(wcTimeout);
    context.subscriptions.push(disposable);
}   

我尝试过或考虑过的:


旁注:我 对此范例中的最佳实践感兴趣。例如,是否有一个流行的节点库包装了我可能想考虑使用的 js 计时器?但是,这不是我对此 post 的主要关注点。如果您要对延迟机制 (setTimeout()/clearTimeout()) 发表评论,请就此 environment/paradigm 中的最佳实践(超越 "that's ugly" 或“这不是[你会亲自]去做。

暂时不能。

github 上针对 vscode 提出了一个相关问题:https://github.com/Microsoft/vscode/issues/2732

回复中给出的不允许关闭信息消息的原因是"their intent is that a user must react on them".

那里建议使用状态栏显示需要更新/关闭的消息作为推荐方法。

虽然消息似乎没有明确的关闭API(https://github.com/Microsoft/vscode/issues/2732),我的解决方法是使用进度来模拟自动关闭通知:

      vscode.window.withProgress(
        {
          location: vscode.ProgressLocation.Notification,
          title: 'Finding ...',
          cancellable: false,
        },
        async (progress, token) => {
         for (let i = 0; i < 10; i++) {
          setTimeout(() => {
            progress.report({ increment: i*10, message: title })
          }, 10000)
        }
       }
      )