“拒绝的承诺未在 1 秒内处理”vscode 扩展 API

Ant*_*tch 7 javascript visual-studio-code vscode-extensions vscode-debugger

我正在尝试为 VS 代码编写一个简单的扩展,将选择重命名为给定的字符串。该应用程序是使用扩展生成器引导的:https://code.visualstudio.com/docs/extensions/example-hello-world#_generate-a-new-extension

为此,我使用以下代码:

const editor = vscode.window.activeTextEditor;
    if (!editor) throw Error;

    const position = editor.selection.active
    const uri = editor.document.uri

    vscode.commands.executeCommand("vscode.executeDocumentRenameProvider", uri, position, "donkey")
        .then(edit => {
            if (!edit) throw Error;

            return vscode.workspace.applyEdit(edit);
        });
Run Code Online (Sandbox Code Playgroud)

该命令绑定到键绑定。我使用 F5 启动调试器(启动 VS Code 实例进行调试,如教程中所示: https: //code.visualstudio.com/docs/extensions/example-hello-world#_debugging-your-extension)。然后,我在该调试实例中打开的文件中选择一堆代码,然后按我的按键绑定。

但是,在调试控制台中,我收到“拒绝的承诺未在 1 秒内处理”。不会抛出任何错误,并且由于executeCommand是一个Thenable,而不是一个真正的Promise,所以我无法对其调用catch()。

我尝试将调用包装在 try/catch 块中,但没有成功。当我尝试其他操作时,例如使用 vscode.window.showInformationMessage 显示消息或提示用户输入,它可以工作,但我没有看到错误。

我也尝试对扩展的 Typescript 版本执行相同的操作,但我得到了相同的行为。

我不明白我做错了什么,我缺少什么吗?

Mat*_*ner 6

Thenable.then有两个参数:成功延续和失败延续。您可以使用失败延续来确保拒绝得到正确处理:

vscode.commands.executeCommand("vscode.executeDocumentRenameProvider", uri, position, "donkey")
    .then(edit => {
        if (!edit) throw Error;

        return vscode.workspace.applyEdit(edit);
    })
    .then(undefined, err => {
       console.error('I am error');
    })
Run Code Online (Sandbox Code Playgroud)

这样,如果executeCommand,之前的then,或applyEdit失败,则拒绝被正确处理

  • 多么奇怪啊。我在使用 .then(fn, err=>{...})` 时遇到了类似的问题,但在使用 .then(fn).catch(err=>{...})` 时没有遇到类似的问题。它们不应该是一样的吗? (2认同)