我试图为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);
});
该命令绑定到键绑定。我使用F5启动调试器(启动一个vs代码实例进行调试,如教程:https://code.visualstudio.com/docs/extensions/example-hello-world#_debugging-your-extension)。然后,我在我在该调试实例中打开的文件中选择一堆代码并按下我的键绑定。
但是,在调试控制台中,我得到的拒绝承诺不会在1秒内得到处理"。没有抛出错误,因为executeCommand是一个Thenable,而不是一个真正的Promise,我不能在它上面调用catch()。
我尝试将调用包装在try / catch块中,但没有成功。 当我尝试其他做其他事情时,比如用vscode.window.showInformationMessage显示一条消息或提示用户输入它是否有效并且我没有看到错误。
我也尝试使用扩展的Typescript版本做同样的事情,但我也有同样的行为。
我不知道自己做错了什么,有什么我想念的吗?
答案 0 :(得分:1)
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');
})
这样,如果executeCommand
,之前的then
或applyEdit
失败,则会正确处理拒绝