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