「Promise、async/awaitってよく出てくるけどなんだろう?」
と思ったので、調べて見ました。
Promiseとは?
Promise
とは、非同期処理の完了時の結果および値を表します。
非同期処理が正常終了すれば結果としてresolve
を返し、そうでなければreject
を返します。
これらの型がPromise
です。
また、戻り値でthen
メソッドを実行することで、前の処理が終わってから次の処理を実行することができます。
例えば、次のような書き方になります。
func1().then( val => func2(val) );
func3();
この時、func1()
の戻り値がPromise
です。
通常だと、上から順に関数が実行されていくので、次はfunc2()
が実行されます。
しかし、then
メソッドに登録されている関数func2()
とfunc3()
は非同期で実行されるので、順不同で実行されます。
async/awaitとは?
async/await
はPromise
をもっと便利に扱うためのものです。
async
で修飾した関数内でPromise
を返す関数にawaitをつけると、その関数から戻り値が返るまで待ちます。
Promise
での例をasync/await
形式で記述すると次の通りです。
const f = async () => {
let val = await func1();
func2(val);
}
f();
func3();
Promise
とthen
で記述した方がスッキリしているように見えますが、実際にはこれらの処理は関数内に記載されます。関数内ではもっと多くの処理を順に実行することが多いので、async/await
の方がスッキリした形になります。
非同期処理とは?
1つの処理が実行中でも、他の処理を実行できるこのような処理を非同期処理と呼びます。
おおざっぱな例だと、「Zoomで会議を聞きながらプログラミングをすること」。
これが、非同期処理です。
非同期処理と反対なものは同期処理ですが、こちらは順番にそれぞれの処理を実行していくことです。
先程の例だと、Zoom会議が終わるまではプログラミングができない状態になります。
こう言うと同期処理にはデメリットしかないかのように感じますが、順番に実行することで動作を把握しやすく、コントロールしやすくなります。
Promise
やasync/await
は非同期処理を同期して扱うことができ、コントロールしやすい状態にしてくれます。
Promiseの使い方
1. まずはPromiseを戻り値に指定しましょう
const func = () => {
return Promise.resolve('Success!');
};
2. 結果/値の受け取ります
func().then( val => {
console.log(val);
//expected output: 'Success!'
});
async/awaitの使い方
1. まずはPromiseを戻り値に指定しましょう
ここはPromise
と同じです。
const func = () => {
return Promise.resolve('Success!');
};
2. 結果/値の受け取ります
const f = async() => {
const val = await promise1();
console.log(val);
}
f();
//expected output: 'Success!'