async
Promise
を利用した非同期処理をより簡単に書ける構文としてasync
/await
が存在します。
この構文を利用することで、非同期処理をより同期処理と同じような文脈で書くことができるようになります。
async
/await
は基本セットで使いますが、本ページではasync
を主に取り上げます。
async
関数、async
メソッド
関数、メソッドの前にasync
キーワードをつけると、たとえその関数内でPromise
が返されていなくても、戻り値の型をPromise
で包んで返します。async
関数、メソッドの中ではawait
キーワードを使うことができます。await
についてはawait
のページをご参照ください。
📄️ await
Promiseを利用した非同期処理をより簡単に書ける構文としてasync/awaitが存在します。
ts
async functionrequestAsync ():Promise <number> {return 1;}constfetchAsync = async ():Promise <number> => {return 1;};classUserRepository {asyncfind (id : string):Promise <User > {const {name ,age } = awaitfindById (id );return {id ,name ,age ,};}}
ts
async functionrequestAsync ():Promise <number> {return 1;}constfetchAsync = async ():Promise <number> => {return 1;};classUserRepository {asyncfind (id : string):Promise <User > {const {name ,age } = awaitfindById (id );return {id ,name ,age ,};}}
この例ではPromise
ではない定数を返していますがasync
関数はその戻り値をPromise
で包んでいます。
ts
async functionrequestAsync ():Promise <number> {return 1;}// requestAsyncはこれと同じfunctionrequest ():Promise <number> {return newPromise ((resolve ) => {resolve (1);});}requestAsync ().then ((result ) => {console .log (result );// @log: 1});
ts
async functionrequestAsync ():Promise <number> {return 1;}// requestAsyncはこれと同じfunctionrequest ():Promise <number> {return newPromise ((resolve ) => {resolve (1);});}requestAsync ().then ((result ) => {console .log (result );// @log: 1});
async
関数の宣言
JavaScriptにはみっつの関数の宣言方法がありますが、それらをasync
関数として宣言することもできます。
ts
async functionrequestAsync1 ():Promise <number> {return 1;}constrequestAsync2 = async function ():Promise <number> {return 1;};constrequestAsync3 = async ():Promise <number> => {return 1;};
ts
async functionrequestAsync1 ():Promise <number> {return 1;}constrequestAsync2 = async function ():Promise <number> {return 1;};constrequestAsync3 = async ():Promise <number> => {return 1;};
async
メソッドとアクセス修飾子
メソッドでアクセス修飾子をつけたい場合はasync
の前につけます。
ts
classUserRepository {public asyncfind (id : string):Promise <User > {const {name ,age } = awaitfindById (id );return {id ,name ,age ,};}}
ts
classUserRepository {public asyncfind (id : string):Promise <User > {const {name ,age } = awaitfindById (id );return {id ,name ,age ,};}}
async
関数、メソッドの戻り値
async
関数はPromise
を戻り値として返すことも可能です。このときPromise<Promise<T>>
のようにPromise
が二重に包まれることはなく、Promise<T>
となります。
ts
async functionrequestAsync ():Promise <number> {return newPromise ((resolve ) => {resolve (1);});}requestAsync ().then ((result ) => {console .log (result );// @log: 1});
ts
async functionrequestAsync ():Promise <number> {return newPromise ((resolve ) => {resolve (1);});}requestAsync ().then ((result ) => {console .log (result );// @log: 1});
async
関数、メソッドをreject(拒否)する
async
関数、メソッドを拒否するためにはasync
関数、メソッド内でthrow
を使うだけです。
ts
async functionrequestAsync ():Promise <number> {throw newError ("error");}
ts
async functionrequestAsync ():Promise <number> {throw newError ("error");}
これでrequestAsync
が返すPromise
はreject(拒否)されます。