Аналог goto в JS

Я пишу функцию, которая определяет какой функционал запускать на конкретной кнопке из 5 ей однотипных(рабочая область у них одна но действуют по разному). В общем если бы я писал на C или PHP то goto я бы использовал примерно так.

activate() {
        if(MainActions.#stack.peek() !== this.dataset.action_type)
            MainActions.#close_main_action();
        switch(this.dataset.action_type) {
            case 'sync-with-github':
                break;
            case 'split-list':
                MainActions.#split_list_activate();
                goto function_end;
                break;
            case 'combine-lists':
                MainActions.#combine_lists_activate();
                goto function_end;
                break;
            case 'create-new-list':
                MainActions.#create_new_list_activate();
                goto function_end;
                break;
            case 'close-editing':
                MainActions.#close_main_action();
                MainActions.#close_main_action_hide_button();
                break;
        }
        return;
        function_end:
        MainActions.#stack.push(this.dataset.action_type);
        MainActions.#close_main_action_show_button();
    }

Как видно из кода я хочу добавлять в стек данные получаемые от нажатия только на определенные кнопки. Прописывать одно и то же содержимое в каждый case не очень хочется. Конечно можно создать отдельный метод с содержимым после function_end и подключать его в каждый нужный case, но заси..ать класс методом не имеющим смысла для этого класса(да да он имеет смысл только для метода activate а не для всего класса) - тоже некрасиво.

Вопрос: Чем можно заменить goto в JS для решения сложившейся ситуации?


Ответы (2 шт):

Автор решения: Andrei Khotko

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

activate() {
    const pushActionToTheStack = () => {
        MainActions.#stack.push(this.dataset.action_type);
        MainActions.#close_main_action_show_button();
    };
  
    if (MainActions.#stack.peek() !== this.dataset.action_type)
        MainActions.#close_main_action();
    switch (this.dataset.action_type) {
        case 'sync-with-github':
            break;
        case 'split-list':
            MainActions.#split_list_activate();
            pushActionToTheStack();
            break;
        case 'combine-lists':
            MainActions.#combine_lists_activate();
            pushActionToTheStack();
            break;
        case 'create-new-list':
            MainActions.#create_new_list_activate();
            pushActionToTheStack();
            break;
        case 'close-editing':
            MainActions.#close_main_action();
            MainActions.#close_main_action_hide_button();
            break;
    }
}

Вообще, добавить приватный метод в класс - тоже нормальное решение, даже если он используется только одним методом, ведь метод решает часть общей задачи, которой занимается весь класс

→ Ссылка
Автор решения: Grundy

Если очень хочется - можно воспользоваться метками

function activate(type) {
  const stack = [];
  label_switch: {
    switch (type) {
      case 'sync-with-github':
        break;
      case 'split-list':
        stack.push('split-list');
        break label_switch;
      case 'combine-lists':
        stack.push('combine-lists');
        break label_switch;
      case 'create-new-list':
        stack.push('create-new-list');
        break label_switch;
      case 'close-editing':
        stack.push('close-editing');
        stack.push('close-editing-2');
        break;
    }
    return stack;
  }

  stack.push('after-swicth');
  return stack;
}

console.log(activate('sync-with-github'))
console.log(activate('split-list'))
console.log(activate('combine-lists'))
console.log(activate('create-new-list'))
console.log(activate('close-editing'))

→ Ссылка