Простая функция JavaScript отказывается работать из-за странной ошибки - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующая функция "Saturday_Date", которая отказывается работать, возвращая мне следующую ошибку, в то время как функция "Today_Date" работает так же хорошо ...

TypeError: Невозможно найти функцию в объекте 8. (RhinoScriptRunner.run # 1819)

Это нерабочая функция и соответствующий код:

    function tomorrow_date() {
    var $current_year  = new Date().getUTCFullYear();
    var $current_month = new Date().getMonth() + 1;
    var $current_day   = new Date().getUTCDate() + 1;

    if($current_day == 31 && $current_month.in(01, 03, 05, 07, 08, 10, 12)) {
        if($current_month == 12) {
            $current_day   = 01;
            $current_month = 01;
            $current_year  =+ 1;
        } else {
            $current_day = 01;
            $current_month =+ 1;
        }
    } else if($current_day == 30 && $current_month.in(02, 04, 06, 09, 11)) {
        $current_day = 01;
        $current_month =+ 1;
    }

    if($current_month.toString().length == 1) {
        var $saver = $current_month.toString();
        $current_month = "0";
        $current_month = $current_month + $saver;
    }

    var $unified_tomorrow = $current_year.toString() + "-" + $current_month.toString() + "-" + $current_day.toString();
    return $unified_tomorrow;
}

var $static_task_activity_date = tomorrow_date();
_alert($static_task_activity_date);

У меня такой вопрос, почему выполнение моей "завтрашней даты" возвращает мне такую ​​странную ошибку?

Хотя следующая функция today_date, приведенная ниже, выполняется так же хорошо, без каких-либо проблем.

    function today_date() {
    var $current_year  = new Date().getUTCFullYear();
    var $current_month = new Date().getMonth() + 1;
    var $current_day   = new Date().getUTCDate();

    if($current_month.toString().length == 1) {
        var $saver = $current_month.toString();
        $current_month = "0";
        $current_month = $current_month + $saver;
    }

    var $unified_today = $current_year.toString() + "-" + $current_month.toString() + "-" + $current_day.toString();
    return $unified_today;
}

var $today_date = today_date();
_alert($today_date);

Ответы [ 5 ]

0 голосов
/ 31 августа 2018

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

Типичная ошибка в Chrome выглядит следующим образом:

Uncaught TypeError: undefined не является функцией Структура ошибки следующая:

Uncaught TypeError: эта часть сообщения обычно не очень полезна. Uncaught означает, что ошибка не была перехвачена в операторе catch, а TypeError - это имя ошибки. undefined не является функцией: это часть сообщения. С сообщениями об ошибках вы должны читать их буквально. Например, в данном случае это буквально означает, что код пытался использовать undefined, как если бы он был функцией. Другие браузеры на основе webkit, такие как Safari, выдают ошибки в формате, подобном Chrome Ошибки в Firefox похожи, но не всегда включают первую часть, и последние версии Internet Explorer также дают более простые ошибки, чем Chrome, но в этом случае более простое не всегда означает лучшее.

Теперь о фактических ошибках.

Предоставлено Дэвидвальшем. Надеюсь, поможет.

0 голосов
/ 31 августа 2018

Все ваши ответы помогли мне, и я создал безупречный код, чтобы всегда динамически получать дату завтрашнего дня на 100% правильно:

  • Завтрашний день был зафиксирован путем изменения 30 на 31 и 31 на 32;
  • Добавлено рекомендуемое исправление для месяца в IF, и оно заработало;
  • Удалены ненужные теги UTC в функциях даты JavaScript;
  • И, наконец, но самое главное, добавлено динамическое февральское правило для определения 28 (29 кодовых) дней в обычные годы и 29 (30 кодовых) в високосные годы.

Завтрашняя дата:

function tomorrow_date() {
    var $current_year  = new Date().getFullYear();
    var $current_month = new Date().getMonth() + 1;
    var $current_day   = new Date().getDate() + 1;

if($current_day == 32 && [1, 3, 5, 7, 8, 10, 12].indexOf($current_month) >= 0) {
    if($current_month == 12) {
        $current_day   = 01;
        $current_month = 01;
        $current_year  = current_year + 1;
    } else {
        $current_day = 01;
        $current_month = $current_month + 1;
    }
} else if($current_day == 31 && [4, 6, 9, 11].indexOf($current_month) >= 0) {
    $current_day = 01;
    $current_month = $current_month + 1;
} else {
    var $year_type_total_days = (($current_year % 4 === 0 && $current_year % 100 > 0) || $current_year %400 == 0) ? 366 : 365;

    if($current_day == 29 && [2].indexOf($current_month) >= 0 && $year_type_total_days == 365){
        $current_day   = 01;
        $current_month = 03;
    } else if($current_day == 30 && [2].indexOf($current_month) >= 0 && $year_type_total_days == 366) {
        $current_day   = 01;
        $current_month = 03;
    }
}

if($current_month.toString().length == 1) {
    var $saver = $current_month.toString();
    $current_month = "0";
    $current_month = $current_month + $saver;
}

if($current_day.toString().length == 1) {
    var $saver = $current_day.toString();
    $current_day = "0";
    $current_day = $current_day + $saver;
}

var $unified_tomorrow = $current_year.toString() + "-" + $current_month.toString() + "-" + $current_day.toString();
return $unified_tomorrow;
}

Сегодняшняя дата:

function today_date() {
    var $current_year  = new Date().getFullYear();
    var $current_month = new Date().getMonth() + 1;
    var $current_day   = new Date().getDate();

    if($current_month.toString().length == 1) {
        var $saver = $current_month.toString();
        $current_month = "0";
        $current_month = $current_month + $saver;
    }

    if($current_day.toString().length == 1) {
        var $saver = $current_day.toString();
        $current_day = "0";
        $current_day = $current_day + $saver;
    }

    var $unified_today = $current_year.toString() + "-" + $current_month.toString() + "-" + $current_day.toString();
    return $unified_today;
}
0 голосов
/ 30 августа 2018

Измените это с

if($current_day == 31 && $current_month.in(01, 03, 05, 07, 08, 10, 12))

до

if($current_day == 31 && $current_month in [01, 03, 05, 07, 08, 10, 12])

Ключевое слово in является оператором, а не функцией и работает с массивами. Поэтому вам нужно менять это везде, где вы используете оператор in.

0 голосов
/ 30 августа 2018

Вы используете функцию "in" для массивов, это не правильно. Функция "in" используется, чтобы узнать, существуют ли свойства в объекте. Вы можете использовать функцию "indexOf" для поиска значений внутри массива. Таким образом, вы должны включить indexOf и выполнить проверку по возвращаемому значению индекса значения.

PS: Ваша логика кода вернет неправильные значения, когда месяц февраль. Февральское значение равно 02, и оно никогда не достигнет $ current_day = 30. Февраль имеет максимум 28 или 29. Вы должны исправить это в своем коде.

Проверьте этот сниппет, используя текущую логику и функцию indexOf.

    function tomorrow_date() {
    var $current_year  = new Date().getUTCFullYear();
    var $current_month = new Date().getMonth() + 1;
    var $current_day   = new Date().getUTCDate() + 1;

    if($current_day == 31 && [01, 03, 05, 07, 08, 10, 12].indexOf($current_month) >= 0) {
        if($current_month == 12) {
            $current_day   = 01;
            $current_month = 01;
            $current_year  =+ 1;
        } else {
            $current_day = 01;
            $current_month =+ 1;
        }
    } else if($current_day == 30 && [02, 04, 06, 09, 11].indexOf($current_month) >= 0) {
        $current_day = 01;
        $current_month =+ 1;
    }

    if($current_month.toString().length == 1) {
        var $saver = $current_month.toString();
        $current_month = "0";
        $current_month = $current_month + $saver;
    }

    var $unified_tomorrow = $current_year.toString() + "-" + $current_month.toString() + "-" + $current_day.toString();
    return $unified_tomorrow;
}

var $static_task_activity_date = tomorrow_date();
console.log("Tomorrow's date: " + $static_task_activity_date);
0 голосов
/ 30 августа 2018

Выполнение new Date().getMonth() + 1 дает в результате число 8, поэтому $current_month становится 8. И пытаясь выполнить $current_month.in(01, 03, 05, 07, 08, 10, 12) вы получаете ошибку. Вместо этого вы можете выполнить следующую проверку

[01, 03, 05, 07, 08, 10, 12].indexOf($current_month) > -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...