Chapter 02

async/awaitとPromise

いーちゃん
いーちゃん
2021.08.15に更新

...async/await、一体何者...?

async function asyncHello() {
  // 3秒待つPromise = 擬似的なwaitはこう書けます
  await new Promise(resolve => {
    window.setTimeout(() => {
      resolve();
    }, 3000);
  });
  // 3秒経ったらHelloを返します
  return "Hello!";
}

console.log(asyncHello());
// 3秒後に"Hello!"と表示したい

いきなり実際のコード例を出してみました。が、思う通りには動きません。
実はasync関数を呼び出したときに返ってくるのもまたPromiseです。

ということで、正しく書き換えると、

asyncHello().then(result => console.log(result));

となりますね。
async関数はPromiseオブジェクトを返す、await演算子は直後のPromiseオブジェクトがresolveされるのを待って結果を返すはたらきがあります。

async function asyncHello() {
  return "Hello!";
}
asyncHello();
// ほぼ同じ
new Promise((resolve) => {
  resolve("Hello!");
});

// rejectする場合
async function asyncHello() {
  throw new Error("Hello!")
}
asyncHello();
// ほぼ同じ
new Promise((resolve) => {
  reject(new Error("Hello!"));
  // throw new Error("Hello!"); してもよい
});

なお、await演算子の直後のPromiseオブジェクトがrejectされた場合は、エラーがthrowされます。