оператор if внутри цикла работает. Но не после того, как я добавлю «зацикленную» / «повторную» выборку - PullRequest
0 голосов
/ 04 ноября 2019

Я уже публиковал подобный вопрос ранее, но я не был достаточно кратким. Итак, я иду!

Я извлекаю некоторые данные, массив объектов с веб-сайта, а затем перебираю их, чтобы изменить. Я изменяю его исключительно потому, что мне нужны новые элементы внутри каждого объекта в массиве, чтобы потом выполнить на них некоторые «операторы if».

Я обнаружил, что мой цикл и операторы if работают нормально без функции fetch. Однако, когда я добавляю его, оператор if, который должен возвращать true, делает иначе.

Пример кода находится внизу.

Эта часть работает вне выборки, если я ее запускаюкак есть (после того, как я получил массив данных объектов. Я запустил код без выборки, и все было в порядке.)

if (time < new Date(new Date(Date.now()).toLocaleString('en-US', {timeZone: 'UTC'}))) {
  var time = new Date(new Date(Date.now()).toLocaleString('en-US', {timeZone: 'UTC'}))
  //changing time with current time in UTC if time is "smaller"
} else {
  //do nothing
}

for (let i = 0; i < data.length; i++) {
  data[i]['ontime'] = (new Date(new Date(data[i].starttime).toLocaleString('en-US', {timeZone: 'UTC'})))
  data[i]['estimatedtime'] = dateAdd(new Date(time), 'second', Math.round(data[i].distance.value / 50 * 60 * 60))
  for (let j = 0; j < data.rooms.length; j++) {
    /*push and save some elements*/
  }

  if (data[i].ontime > data[i].estimatedtime) {
    //do something
  } else { // repeat fetch if the condition is false
    console.log('unsuitable!')
    getData()
  }
}

Я попытался сделать два цикла. Один для изменения объектов массива данных, а другой для операторов if + Я использовал функцию asynch / await для этих двух отдельных циклов, чтобы убедиться, что второй цикл (операторы if) запускается только после завершения первого цикла. это не похоже на работу. Ранее я писал, что ошибка была с датой, что она отображала «недопустимую дату». Я исправил это, но у меня все еще остается та же проблема.

var errorcheck = []
time = new Date('11/2/2019 14:25')

function getData() {
  fetch(fetch_url)
    .then((response) => {
      if (!response.ok) {
        errorcheck.push(response.status)
      } // if response is not ok, i store the error code.
      else if (response.ok) {
        response.json()
          .then(data => data = data)
          .then(() => {
            if (data.length > 0) { // checking if any "data array" has objects
              if (time < new Date(new Date(Date.now()).toLocaleString('en-US', { timeZone:'UTC'}))) {
                var time = new Date(new Date(Date.now()).toLocaleString('en-US', { timeZone:'UTC'}))
                //changing time with current time in UTC if time is "smaller"
              } else {
                //do nothing
              }

              for (let i = 0; i < data.length; i++) {
                data[i]['ontime'] = (new Date(new Date(data[i].starttime).toLocaleString('en-US', {timeZone: 'UTC'})))
                data[i]['estimatedtime'] = dateAdd(new Date(time), 'second', Math.round(data[i].distance.value / 50 * 60 * 60))

                for (let j = 0; j < data.rooms.length; j++) {
                  /*push and save some elements*/
                }

                if (data[i].ontime > data[i].estimatedtime) {
                  //do something
                } else { // repeat fetch if the condition is false
                  console.log('unsuitable!')
                  getData()
                }
              }
            } else {
              console.log('no object in data!')
              getData() //if data array had no objects inside, i repeat the fetch
            }
          })
      }
    })
}

ОБНОВЛЕНИЕ:

Я удалил следующий код, и он тоже работал с выборкой.

if (time < new Date(new Date(Date.now()).toLocaleString('en-US', { timeZone:'UTC'}))) {
                var time = new Date(new Date(Date.now()).toLocaleString('en-US', { timeZone:'UTC'}))
                //changing time with current time in UTC if time is "smaller"
              } else {
                //do nothing
              }

Мне нужен этот код для запуска каждый раз, когда выполняется выборка. В противном случае отметка времени (estimatedtime) была бы совершенно неактуальной. я попытался сделать второй .then после 1-го и 2-го тоже. time не было обновлено. Как и time (и, следовательно, estimatedtime), у меня есть другие переменные, которые нужно изменять каждый раз, когда выборка запускается или завершается.

1 Ответ

0 голосов
/ 12 ноября 2019

Я не уверен на 100% в вашей логике. Я просто добавляю элемент в документ, прикрепляю событие и запускаю его, когда требуются дополнительные данные.

Я также создал myApp для хранениязначения, а не несколько глобальных переменных.

var myApp = myApp || {
  errorcheck: []
};
// these could be in the object above like the errorcheck is
myApp.lastTimestamp = new Date();
myApp.fetch_url = "some/urlthing";
myApp.time = new Date.UTC();

var aNewDivElement = document.createElement("div", {
  id: "newDivElement"
});
var getMoreDataEvent = new Event('getMoreData');
aNewDivElement.addEventListener('getMoreData', function(e) {
  myApp.getData();
}, false);

document.body.appendChild(aNewDivElement);
var divHoldEvents = document.getElementById("newDivElement");

myApp.getData = function() {
  fetch(myApp.fetch_url)
    .then(function(response) {
      if (response.ok) {
        let data = response.json();
        // checking if any "data array" has objects
        if (data.length > 0) {
          myApp.myUtcDateTime = new Date.UTC();
          if (myApp.time < myApp.myUtcDateTime) {
            myApp.time = myApp.myUtcDateTime;
          }
          for (let i = 0; i < data.length; i++) {
            // seems odd to do these, do we mean the new array?
            data[i].ontime = myApp.myUtcDateTime;
            let est = dateAdd(new Date(myApp.time), 'second', Math.round(data[i].distance.value / 50 * 60 * 60));
            data[i].estimatedtime = est;
            for (let j = 0; j < data.rooms.length; j++) {
              /*push and save some elements*/
            }
            if (data[i].ontime > data[i].estimatedtime) {
              //do something
            } else { // repeat fetch if the condition is false
              console.log('unsuitable!');
              divHoldEvents.dispatchEvent(getMoreDataEvent);
            }
          }
        } else {
          console.log('no object in data!');
          //if data array had no objects inside, i repeat the fetch
          divHoldEvents.dispatchEvent(getMoreDataEvent);
        }
      } else {
        // if response not ok, store the error code.
        this.errorcheck.push(response.status);
      }
    });

};
// start things off 
divHoldEvents.dispatchEvent(getMoreDataEvent);
...