Аналог 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 шт):
Можно создать локальную функцию внутри метода и использовать ее. 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;
}
}
Вообще, добавить приватный метод в класс - тоже нормальное решение, даже если он используется только одним методом, ведь метод решает часть общей задачи, которой занимается весь класс
Если очень хочется - можно воспользоваться метками
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'))