まず、 Cannot read property 'data' of undefined
エラーが出るのは showWeekdaysForecast()
をすぐに呼んでいるせいです。
function showWeekdaysForecast(weekDays) {
//console.log(weekDays); //local data 現地情報(オブジェクト) →「undefined」と出ます。
// ↑ここで weekDays が undefined なのは……
略
}
// ↓ここで引数を渡さずに呼んでいるから
showWeekdaysForecast();
次に wDayNum
に関する話です。関数の外側の変数を参照してその値を書き換えることは、単純な例ならば以下のように実現できます:
function main() {
let value = 0;
function setValue() {
value = 42;
}
setValue();
console.log(value); // => 42
}
しかし axios
によるリクエストのような、 Promise が絡んでくるコードでは話が別です。 Promise は非同期に実行されるので、 .then()
で登録した関数はいつ呼ばれるか分からないからです(少なくとも現在のイベントループ完了前には呼ばれない、つまり同期的には呼ばれないことが仕様で保証されています)。
function main() {
let value = 0;
function setValue() {
value = 42;
}
// ここで axios.get('/xxx') は Promise オブジェクトを返す。
// Promise に対して .then() を呼んで、 Promise 成功時に実行する関数を登録する。
axios.get('/xxx').then(setValue);
// まだ setValue() は呼ばれていない。
console.log(value); // => 0
// setValue() が呼ばれるタイミングは必ずこれ以降になる。いつかは分からない。
}
.then()
で登録した関数に続けて何かを実行したい場合には、 .then()
をチェーンして書くことができます。このとき、先に登録した関数の返り値が次の関数の引数として渡されます。
function main() {
function getValue() {
return 42;
}
function showValue(value) {
console.log(value);
}
axios.get('/xxx').then(getValue).then(showValue);
// この後のいつかのタイミングでまず getValue() が呼ばれ、
// その返り値を引数にして(さらに後のタイミングで) showValue() が呼ばれる。
}
よって、 showWeekdaysForecast
で得た wDayNum
を別の処理に渡したいなら、 wDayNum
を返り値にし、それを引数で受け取る後続の処理を .then()
で登録してください。