Сбой оператора переключения Javascript

#javascript #switch-statement

#javascript #switch-statement

Вопрос:

Вероятно, действительно глупая проблема, но: это выводит ‘yeeeeeees’ в консоль, но в инструкции switch выдается ошибка неизвестного шага.

Что я делаю не так?

         if (step === 'menuLoaded') console.log('yeeeeeeeees');
        switch (step) {
            case 'menuLoaded':
                this.window.activate_side_menu();
                this.handleDomainFtp();
                break;
            case 'ftpStep1':
                this.handleDomainFtp(1);
                break;
            case 'ftpStep2':
                this.handleDomainFtp(2);
                break;
            case 'startMysql':
                alert('starting mysql');
                this.handleDomainMysqlList();
                break;
            case 'mysqlList':
                this.handleDomainMysql();
                break;
            case 'mysqlPage':
                this.handleDomainMysql(true);
                break;
            case 'done':
                run();
                break;
            default:
                throw new Error('Unknown step: '   step);
                break;
        }
  

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

1. Хммм … это может быть проблема с «вводом»; что произойдет, если вы это сделаете if (step == 'menuLoaded') console.log('yeeeeeeeees'); ? Я не уверен, какое сравнение произвел бы переключатель, но я думаю, что это было бы === но, возможно, нет.

2. this.window предполагается, что это просто window ?

3. @Levi Morrison, если === выдает журнал консоли, то это не проблема с набором текста.

4. Похоже, это правильно. Вы уверены, что этот шаг равен тому, что вы думаете, что он равен? Каково его значение при отладке? jsfiddle.net/YP2gy/1

5. Когда я запускаю ваш код, он отлично работает при назначении 'menuLoaded' для step .

Ответ №1:

Ошибка, которую я получаю, заключается в TypeError: Object [object DOMWindow] has no method 'activate_side_menu' — вы убедились, что объявили эту функцию где-нибудь в доступной области?

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

1. Да, хороший момент! 🙂 Хотя я думаю, что если в одной из функций внутри будет выдана ошибка case 'menuLoaded' , инструкция switch автоматически завершит текущий регистр и выполнит инструкцию по умолчанию. Таким образом, в принципе, ваш оператор switch может работать точно так, как ожидалось, но this.window.activate_side_menu() или this.handleDomainFtp() может произойти сбой.

2. Сказав это, я на самом деле не вижу в документах ECMAScript ничего, что указывало бы на то, что ошибка в предложении case должна привести к завершению текущего блока выполнения и переходу к предложению default.

Ответ №2:

Поскольку, по-видимому, нет другого способа закрыть мой вопрос, я просто отвечу на него сам.

Проблема заключалась в следующем коде. Позже у меня появляется другая инструкция switch с точно такой же ошибкой ().

Как я уже сказал, вероятно, что-то глупое….

Но спасибо всем за потраченное время!

Ответ №3:

Скорее всего, нужно было присвоить ‘this’ ‘var self’ и использовать ‘self’ вместо this .

Ответ №4:

попробуйте использовать инструкцию по умолчанию без «break;»

 default:
            throw new Error('Unknown step: '   step);
}
  

Ответ №5:

Я скорее уверен, что JavaScript switch() не будет принимать строки — вы должны использовать целочисленные значения. Если вы хотите использовать имена, используйте некоторые переменные, подобные перечислению:

 const step_menuLoaded = 0;
const step_menuFtp1 = 1;
const step_menuFtp2 = 2;
const step_startSql = 3;
...
  

Вы проверили свой код / исходный код на наличие непечатаемых символов внутри строк?

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

1. Вместо того, чтобы быть «довольно уверенным», возможно, было бы лучше просто быть «уверенным». Javascript switch отлично работает со строками.

2. Ха-ха, я собирался сам создать jsfiddle. Я слишком устал, я думаю. 1 @OriginalSyn