async関数とは非同期を扱うものです。
非・同期ということは同期でない。つまりいつ終わるかわからないものを扱います。
いつ終わるかわからないからと言って処理を止めてたら待っている間、画面が固まったりするので、そういったものは後回しにしておいて待っている間は他の処理を行い、終わったらその続きの処理を行おうという考え方です。
thenメソッドの中はいつ終わるのかわからないものが終わったら実行されます。
console.log(hoge)はいつ終わるかわからない処理を待っている間に実行されます。
この場合の対処法は、
async awaitを利用すると本来実現したいことと似たようなことはできます。
awaitするには何かしらの関数に入れなければなりません。
(async () => {
let hoge;
hoge = await fuga(); // fugaが終了するまで待つ
console.log(hoge);
})();
または
async function test() {
let hoge;
hoge = await fuga(); // fugaが終了するまで待つ
console.log(hoge);
}
test();
こちらの方が詳しく説明してくださっているのでご覧になってみてください!