Функция возвращает неперехваченную ссылочную ошибку

#javascript #node.js #datatables

Вопрос:

Я пытаюсь создать таймер обратного отсчета в своей таблице данных, используя приведенный ниже код. Однако я получаю неперехваченную ссылочную ошибку — «таймеры не определены». Я не могу понять, почему.

 var table = $("#myTable").DataTable({
  processing: true,
  serverSide: true,
  ajax: {
    url: "/getOrder",
    dataSrc: "orderStr",
  },
  columns: [
    { data: "id" },
    { data: "market" },
    { data: "order_type" },
    { data: "trade_amount" },
    { data: "strike_price" },
    { data: "filled_status" },
    { data: "kof_frame" },
    { data: "time_frame" },
    { data: "expiration_date" },
    { data: "timestamp" },
    {
      data: "timestamp",
      render: function (timestamp) {
        for (var i = 0; i < timestamp.length; i  ) {
          //console.log(tableRows[i]);
          var entryDate = timestamp;
          const second = 1000,
            minute = second * 60,
            hour = minute * 60,
            day = hour * 24;

          countDown = new Date(entryDate).getTime();

          setInterval(function () {
            let now = new Date().getTime();
            distance = countDown - now;

            days = Math.floor(distance / day);
            hours = Math.floor((distance % day) / hour);
            minutes = Math.floor((distance % hour) / minute);
            seconds = Math.floor((distance % minute) / second);

            timers =
              days   "d:"   hours   "h:"   minutes   "m:"   seconds   "s";
          }, 1000);
        }
        return timers;
      },
    },
  ],
});
 

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

1. Вы никогда не объявляли , что что-то называется timers , поэтому при попытке return timers вы получаете ошибку. Только через секунду (по крайней мере) интервал запустится и будет записан в неявный глобальный timers , но сейчас этого не существует.

2. Привет, спасибо за ваш комментарий. Пожалуйста, дайте мне знать, как я могу это исправить. Высоко ценится

3. Вам просто нужно правильно объявить переменную ваших таймеров. используйте let timers , чтобы инициировать его за пределами области действия вашего setInterval, затем вы можете переназначить его значение позже с помощью timers = ...

4. Похоже, для этого потребуется гораздо больше, чем простое исправление. Функция render ищет значение, поэтому все, что возвращает эта функция, будет тем, что вы визуализируете. Но тогда что setInterval же происходит? Он обновляет значение, но ничего не делает для обновления пользовательского интерфейса. В конце функции, которую вы передадите setInterval , вам нужно будет как-то обновить пользовательский интерфейс. Либо через какой-либо API, предоставляемый таблицами данных, либо вручную, ориентируясь на конкретный HTML-элемент и обновляя его.

5. Исправьте это, чтобы сделать что именно? Прямо сейчас код не работает, потому что инструкции бессмысленны. Я не знаю, что должно произойти — каким будет «рабочее состояние», поэтому я не знаю, как его достичь. Прямо сейчас ваш код пытается немедленно вернуть значение, которое будет вычислено только через секунду. Что не может сработать из-за отсутствия путешествий во времени. Более того, значение будет пересчитываться каждую секунду. Но возврат выполняется только один раз. Что здесь должно происходить?