目次
asyncとawaitとは
asyncとawaitは、非同期処理(Promise)を、あたかも同期処理(上から順番に実行されるコード)であるかのように、読みやすく、書きやすくするための仕組みです。
Promiseを簡単に扱うための「シンタックスシュガー(糖衣構文)」とも呼ばれます。
| async | asyncキーワードが付いた関数は、必ずPromiseを返します。 関数内で値をreturnすると、それは自動的に解決済みのPromise(Promise.resolve(値))としてラップされます。 |
| await | Promiseの結果が出るまで、その行の処理を一時停止(待機)するために使います。 async関数の中でしか使用できません。 awaitの後に書かれたPromiseが解決(成功または失敗)されるまで、次の行のコードの実行をブロックします。 Promiseが成功したら、その結果の値を取り出してくれます。 |
Promiseを使用したサンプル
<script>
function test1() {
return new Promise((resolve) => {
resolve("OK");
});
}
test1()
.then((str1) => {
console.log(str1); // OKが出力される
});
</script>
処理の流れは、7行目から2行目の関数が実行された後に8行目以下が実行されます。
3行目は、Promiseの前にnewがありPromiseオブジェクトを生成しています。
更にその前にreturnがあるので生成されたPromiseオブジェクトを返します。
4行目は、resolveがあるのでPromiseオブジェクトはfulfilled(成功)の状態です。
resolvedの時は8行目のようにthenで受ける必要があります。
asyncを使用+resolved(解決した)を返す
上記のPromiseのコードをasyncを使用したコードに書き換えました。
<script>
async function test1() {
return "ok";
}
test1()
.then((str1) => {
console.log(str1); // OKが出力される
});
</script>
2行目にasyncがあります。
この場合、メソッドの呼び出し元にPromiseはfulfilled(成功)の状態で渡されます。
new Promiseもresolveもありませんが、8行目のようにthenで受けれます。
asyncを使用+rejected(却下された)を返す
<script>
async function test1() {
throw new Error("NG");
}
test1()
.then((str1) => {
console.log("OK"); //出力されない
})
.catch((str1) => {
console.log(str1); // NGが出力される
});
</script>
2行目にasyncがあります。
3行目は、throw文で例外をスローしています。
この場合、メソッドの呼び出し元にPromiseはrejected(失敗)の状態で渡されます。
9行目のcatchで受けて文字列が出力されます。
awaitで処理を制御する
<script>
async function test1() {
console.log("a");
await test2();
console.log("b");
return "ok";
}
function test2() {
return new Promise((resolve) => {
setTimeout(() => {
console.log("test2");
resolve();
}, 1000);
});
}
test1()
.then((str1) => {
console.log(str1); //
})
.catch((str1) => {
console.log(str1); //
});
</script>
4行目は、awaitがあります。呼び先のtest2関数は、settimeoutで1秒待つ設定です。
awaitは、9行目のPromiseの結果を受けるまで待つので処理としては、3,4,5行目と順に実行されます。
4行目のawaitがない場合は、test2関数のsettimeoutで1秒待っている間に、3,5行目が終了し、そのあとに4行目の文字列が出力されます。
以下はawaitがあるときのイメージ図です。3,4,5行目の順に文字列が出力されます。

以下は、awaitがないときのイメージ図です。3,5行目と呼び出し元で文字列が出力された後、4行目の文字列が出力されています。

関連の記事
JavaScript Promiseを使用するサンプル
JavaScript 一定時間の経過後に処理を行う (setTimeout)
