関数内の関数/ 同期通信、非同期通信
解決したいこと
関数内の関数/同期通信、非同期通信
JavaScriptで天気予報のアプリを作っています。関数内の関数の変数をスコープによって取り出し、それを使って現地時刻に合わせた曜日を表示したいです。(例えば東京を検索し、今日が月曜日の場合下の週間天気予報には火、水、木。。。のように)
showForecast関数内でshowWeekdaysForecast関数の変数を使ったinnerHTMLの記述をするところが問題でしょうか?(途中までshowForecast関数のresponseからshowWeekdaysForecast関数に受け渡し、その後またshowForecast関数内で処理をするということになるため)
発生している問題・エラー
Uncaught (in promise) TypeError: Cannot read property 'data' of undefined
at showWeekdaysForecast (index copy.js:156)
at showForecast (index copy.js:161)
該当するソースコード
//show forecast
function showForecast(response) {
console.log(response); //weekly forecast
//change icons
let forecastElements = document.getElementById("forecast");
forecastElements.innerHTML = null;
let forecast = null;
//Temperature
let maxTemp = null;
let minTemp = null;
//Local time
let localTimeApiKey = "KTPS14XG8OUY";
let latitude = response.data.lat;
console.log(latitude);
let longitude = response.data.lon;
let localTimeApiUrl = `https://api.timezonedb.com/v2.1/get-time-zone?key=${localTimeApiKey}&format=json&by=position&lat=${latitude}&lng=${longitude}`;
axios.get(localTimeApiUrl).then(showWeekdaysForecast);
//show the day of a week in local time
let wDayNum = 0;
function showWeekdaysForecast(weekDays) {
//console.log(weekDays); //local data 現地情報(オブジェクト) →「undefined」と出ます。
let wDay = new Date(weekDays.data.formatted);
//↑ここで「Cannot read property 'data' of undefined」と出ます
//console.log(wDay); 現地の日付、時刻
wDayNum = wDay.getDay();
console.log(wDayNum); //weekday number
}
showWeekdaysForecast();
//↑こちらも「dataが定義されていない」と出ます。
console.log(wDayNum);
let weekdays = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
];
let weekDay = document.getElementById("weekDay");
weekDay.innerHTML = null;
for (let index = 1; index < 7; index++) {
forecast = response.data.daily[index];
maxTemp = Math.round(response.data.daily[index].temp.max);
minTemp = Math.round(response.data.daily[index].temp.min);
//↓ここでwDayNumが必要です。
forecastElements.innerHTML += `<div class="circle col-md-1">
<div class=col-md-1" id="weekDay">${weekdays[wDayNum + index]}</div >
<img id="imgForecast" src="https://openweathermap.org/img/wn/${
forecast.weather[0].icon
}@2x.png"/>
<h3>${maxTemp}℃/${minTemp}℃</h3>
</div>`;
}
}
自分で試したこと
async, awaitをfunction showForecastで使いましたがうまくいきませんでした。