0

let objCity
    fetch("/json/city.list.json")
    .then(function(resp) {return resp.json()})
    .then(function(data) {
        objCity = data
    })

let coordLon; let coordLat

function searchCity() { for (key in objCity) { if (objCity[key].name == document.querySelector('.region__header').textContent) { coordLat = objCity[key].coord.lat; coordLon = objCity[key].coord.lon; return openweathermap(coordLat, coordLon, '.temp__num1') } } }

searchCity()

SwaD
  • 10,123
naz
  • 15

1 Answers1

1

Проблема была в том, что функция searchCity запускалась сразу после запуска fetch. Функция получала на вход пустой массив, т.к. данные еще не были получены.

Необходимо изменить структуру вызовов данных. Обернуть fetch в Promise и записать данные в objCity когда придет ответ. После этого выполнять операции над полученными данными.

let objCity;
async function waitFeatch() {
  return new Promise((resolve, reject) => {
    fetch("/json/city.list.json")
      .then(function(resp) {return resp.json()})
      .then(function(data) {
        objCity = data;
        resolve();
      }).catch((e) => {
        reject(e);
    })
  })

} let coordLon; let coordLat;

waitFeatch().then((res) => { const finds = document.querySelector('.region__header').textContent; for (let key in objCity) { if (objCity[key].name === finds) { coordLat = objCity[key].coord.lat; coordLon = objCity[key].coord.lon; return openweathermap(coordLat, coordLon, '.temp__num1') } } });

SwaD
  • 10,123
  • Поправил ответ. Проверьте – SwaD Sep 29 '22 at 23:57
  • Есть, Спасибо блольшое – naz Sep 30 '22 at 00:00
  • От вот этого let objCity; можно избавиться, если в коде не используется, передав в resolve(); данные и получить их в then((res) – SwaD Sep 30 '22 at 00:02