院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

setTimeoutの結果がほしい

setTimeoutの処理の結果が欲しい時
setTimeoutの内側でreturnすればいいと思ったけどそれじゃできない

function wait1sec(num) {
  setTimeout(() => {
    console.log('計算終了'); // #1
    return num * 2;
  }, 10);
  console.log('setTimeoutの次'); // #2
}

function main() {
  let x = wait1sec(100);
  console.log(`計算結果 = ${x}`); // #3
}

main();
//出力結果
// setTimeoutの次 #2
// 計算結果 = undefined #3
// 計算終了 #1

setTimeout自体の戻り値はtimerIdだし、console.log(#3)を遅くしてもだめ。
setTimeoutにコールバック関数を渡しちゃえばできるけど、読みづらい(これがコールバック地獄らしい)。
そんなときはpromiseを使う

function wait1sec(num) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('計算終了'); // #1
      resolve(num * 2);
    }, 10);
  })
  console.log('setTimeoutの次'); // #2
}

async function main() {
  let x = await wait1sec(100);
  console.log(`計算結果 = ${x}`); // #3
}

main();
//出力結果
// 計算終了 #1
// 計算結果 = 200 #2