VS Разработка расширения кода: возможно отменить регистрацию обработчика событий

#visual-studio-code #vscode-extensions

Вопрос:

В моем расширении я хотел бы зарегистрировать прослушиватель событий, когда пользователь выдает команду, но отменяет регистрацию прослушивателя (или обновляет прослушиватель на что-то другое), когда пользователь выдает другую команду.

Например, в конце команды A я регистрируюсь window.onDidChangeActiveTextEditor как нечто (в моем случае я зарегистрировал это в обработчике команды A). В конце команды B я хотел бы отменить эту регистрацию. Я понимаю window.onDidChangeActiveTextEditor , что вернет одноразовый, но я не знаю, как бы я передал этот одноразовый командованию B.

Моя структура кода такова:

 vscode.commands.registerCommand('A', () => {commandA()});
vscode.commands.registerCommand('B', () => {commandB()});

commandA() {
...
vscode.window.onDidChangeActiveTextEditor(() => {commandA();})
}

commandB() {
...
// How do I unregister the event listener?
}
 

Комментарии:

1. сохраните дескриптор в (глобальной) переменной и вызовите dispose() метод в commandB

Ответ №1:

Решил эту проблему, используя подсказку от @rioV8 в комментариях. Преобразуйте код в структуру ваших потребностей, как класс.

 let changeHandle = null;
vscode.commands.registerCommand('A', commandA);
vscode.commands.registerCommand('B', commandB);

commandA() {
  if (!changeHandle)
    changeHandle = vscode.window.onDidChangeActiveTextEditor(commandA);
}

commandB() {
  changeHandle?.dispose();
  changeHandle = null;
}
 

Комментарии:

1. Подробнее смотрите здесь: code.visualstudio.com/api/references/vscode-api#events

2. Чтобы это сработало, вам также необходимо установить changeHandle = null; в конце CommandB(). Но спасибо! Это работает.

3. @Go_printf, ты прав. Будет соответствующим образом обновлен код.