"отклоненное обещание не обработано в течение 1 секунды" vscode Extension API - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать простое расширение для кода 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, а не настоящее обещание, я не могу вызвать catch () для него.

Я пытался обернуть вызов в блок try / catch, но безуспешно. Когда я пытаюсь сделать что-то другое, например, показать сообщение с помощью vscode.window.showInformationMessage или запросить ввод у пользователя, оно работает, и я не вижу ошибки.

Я также пытался сделать то же самое с версией расширения Typescript, но у меня такое же поведение.

Я не вижу, что я делаю неправильно, я что-то упускаю?

1 Ответ

0 голосов
/ 02 мая 2018

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 не пройден, отклонение обрабатывается правильно

...