отклоненное обещание не обработано в течение 1 секунды API расширения vscode

Я пытаюсь написать простое расширение для кода 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, но у меня такое же поведение.

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


person Antha On Twitch    schedule 01.05.2018    source источник
comment
Если в настоящее время это не настоящее обещание, вы могли бы преобразовать его в одно самостоятельно и catch, верно?   -  person CertainPerformance    schedule 01.05.2018
comment
Вы пробовали не try / catch, а catch()?   -  person kshetline    schedule 01.05.2018
comment
Да, я все еще получаю тот же результат. Я читал, что это может быть вызвано невыполнением обещаний без вызова reject () или чего-то еще, однако это исходит из самой функции vscode api.   -  person Antha On Twitch    schedule 01.05.2018


Ответы (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 терпят неудачу, отклонение обрабатывается должным образом.

person Matt Bierner    schedule 01.05.2018
comment
Мэтт, ты легенда. Я никогда не думал о .then(undefined, err => { как о улове, который у вас есть, когда у вас нет улова. Это значительно улучшит читаемость моего кода. - person Peter Wone; 19.03.2019
comment
Как странно. У меня была аналогичная проблема при использовании .then(fn, err=>{...}), но не при использовании .then(fn).catch(err=>{...}). Разве они не должны быть такими же? - person geekley; 24.03.2021