Виджет погоды не извлекает данные JSON из API

#javascript #jquery #json #api #geolocation

#javascript #jquery #json #API #геолокация

Вопрос:

Я пытаюсь создать виджет погоды на основе геолокации. Я наткнулся на фрагмент кода, который я хотел бы использовать повторно, однако это jQuery, и я не смог полностью перевести его на JavaScript.

Проблема начинается уже в начале функции weatherWidget(), где я извлекаю JSON API (который работает до сих пор), но, похоже, я не могу получить доступ к отдельным значениям. Консоль начинается с сообщения о том, что «ipAPI не определен».

Я не до конца понимаю код, вероятно, поэтому мне так сложно перевести его на JavaScript, и хотя я провел много исследований по этому вопросу, я, похоже, не могу разобраться в сути проблемы. Любые предложения приветствуются!

 <section id="weather">

        <h1>Your Weather</h1>
        <div class="visual-only" aria-hidden="true">
            <div id="quick-view">
                <div id="weather-icons">
                <i class="wi"></i>
                <i class="wi"></i>
            </div>
            <div id="loading">
                Loading<span>.</span><span>.</span><span>.</span>
            </div>
            <span id="tempF" class="show">
                <span></span>
                <i class='wi wi-fahrenheit'></i>
            </span>
            <span id="tempC" class="hide">
                <span></span>
                <i class='wi wi-celsius'></i>
            </span>
            </div>
                <div id="grid">
                <div id="location"></div>
                <div id="status"></div>
                <div id="wind">
                <span class="compass">
                    <i class="wi"></i>
                </span>
                <span id="miles" class="show">
                </span>
                <span id="meters" class="hide">
                </span>
            </div>
        </div>
        <button class="weatherBtn">F / C</button>
    </div>
        <p class="visually-hidden">
            Weather data currently unavailable.
        </p>

    </section>
 
 function weatherWidget() {

// Grab the latitude amp; longitude
fetch('https://ipapi.co/json/')
    .then(res => res.json())
    .then(getJSON1(ipAPI));

function getJSON1(ipAPI) {
  let latitude = ipAPI.latitude;
  let longitude = ipAPI.longitude;
  let city = ipAPI.city.replace(/(s)/gi, " "); // Replace spaces
  let region = ipAPI.region_code;
  
  // Grab a local map as background based on user's IP
  let imageURL =
    "https://maps.googleapis.com/maps/api/staticmap?center="   city   "amp;zoom=10amp;size=640x640amp;scale=2amp;format=jpegamp;key="   gmapsKey;

  // Feed the latitude and longitude to the OpenWeatherMap API
  fetch('https://cors-everywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather?lat='   latitude   "amp;lon="   longitude   "amp;APPID="   owKey)
    .then(res => res.json())
    .then(getJSON2());

  function getJSON2(ow) {
    let location = city   ", "   region,
        status = ow.weather[0].main,
        windMeters = ow.wind.speed,
        windMiles = ow.wind.speed * Math.round(2.23694),
        tempF = Math.round(
          ((ow.main.temp - 273.15) * 1.8   32) * 10 / 10
        ).toFixed(0),
        tempC = Math.round(ow.main.temp - 273.15),
        iconSource = ow.weather[0].icon,
        icons = {
          // ow.weather[0].icon to wi
          // Daytime conditions
          "01d": "wi-day-sunny",
          "02d": "wi-day-sunny-overcast",
          "03d": "wi-day-cloudy",
          "04d": "wi-cloudy",
          "09d": "wi-day-sprinkle",
          "10d": "wi-day-rain",
          "11d": "wi-day-thunderstorm",
          "13d": "wi-day-snow",
          "50d": "wi-day-fog",

          // Nightime conditions
          "01n": "wi-stars",
          "02n": "wi-night-partly-cloudy",
          "03n": "wi-night-cloudy",
          "04n": "wi-cloudy",
          "09n": "wi-night-sprinkle",
          "10n": "wi-night-rain",
          "11n": "wi-night-thunderstorm",
          "13n": "wi-night-snow",
          "50n": "wi-night-fog"
        },
        iconName = iconSource.split(" ").map(function(code) {
          var results = [];
          results.push(icons[code]);
          return results.join("");
        }),
        icon = iconName[0],
        extremeSource = ow.weather[0].id.toString(),
        extremes = {
          // ow.weather[0].id to wi
          // Extreme weather conditions
          "900": "wi-tornado",
          "901": "wi-hurricane",
          "902": "wi-hurricane",
          "903": "wi-snowflake-cold",
          "904": "wi-hot",
          "905": "wi-windy",
          "906": "wi-hail",

          // Beaufort wind scale
          "951": "wi-beafort-1",
          "952": "wi-beafort-2",
          "953": "wi-beafort-3",
          "954": "wi-beafort-4",
          "955": "wi-beafort-5",
          "956": "wi-beafort-6",
          "957": "wi-beafort-7",
          "958": "wi-beafort-8",
          "959": "wi-beafort-9",
          "960": "wi-beafort-10",
          "961": "wi-beafort-11",
          "962": "wi-beafort-12"
        },
        extremeName = extremeSource.split(" ").map(function(code) {
          var results = [];
          results.push(extremes[code]);
          return results.join("");
        }),
        extreme = extremeName[0];

      let windIcon = "wi-wind towards-"   ow.wind.deg   "-deg";

    document.querySelector('.sr-only').empty().append("Current conditions in "   city   ": "   status   ", wind at "   windMiles   " MPH ("   windMeters   " m/s)");
      // quick-view
      document.querySelector("#loading").hide();
      document.querySelector("#tempF > span")
        .empty()
        .append(tempF);
      document.querySelector("#tempC > span")
        .empty()
        .append(tempC);
      document.querySelector("#weather-icons > i:first-child").classList.add(icon);
      document.querySelector("#weather-icons > i:last-child").classList.add(extreme);

      // grid
      document.querySelector("#location")
        .empty()
        .append(location);
      document.querySelector("#status")
        .empty()
        .append(status);
      // wind
      document.querySelector(".compass > i")
        .empty()
        .classList.add(windIcon);
      document.querySelector("#miles")
        .empty()
        .append(windMiles   " MPH");
      document.querySelector("#meters")
        .empty()
        .append(windMeters   " m/s");
    }

  function error() {
    document.querySelector("#main").textContent = "Unable to retrieve your location";
  }  
};

document.querySelector(".weatherBtn").click(function() {
    document.querySelector("#tempF").toggle.classList.add("show1 hide1");
    document.querySelector("#tempC").toggle.classList.add("show1 hide1");
    document.querySelector("#miles").toggle.classList.add("show1 hide1");
    document.querySelector("#meters").toggle.classList.add("show1 hide1");
});
}
 

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

1. измените .then(getJSON1(ipAPI)) на либо .then(ipAPI => getJSON1(ipAPI)) или просто .then(getJSON1) на то же самое для .then(getJSON2()) -> .then(ow => getJSON2(ow))

2. @ptothep Отлично, спасибо!