Promise
概説
jslet r:Promise<T> = new Promise<T>((resolve,reject) => {
//ここに記述される処理Aは、この変数r定義の後にある処理B,処理Dと並行して行われる。
//つまり、処理Aは非同期処理である。
/* 処理A */
//非同期処理が完了したらこの関数を呼び出す
resolve(result);
//エラー時はこの様に返す
reject();
}
/* 処理B */
r.then(function onFulfilled(value) {/* 処理C */}[,onRejected]
//onfulfilled関数は非同期処理が成功したときに呼び出されるコールバック関数
//処理Aが終了した後に実行してほしい処理Cをonfulfilled関数に定義できる。
),
.catch(function onrejected{ /* 失敗したときの処理D */})
/**
Promise
オブジェクトの解決について復習する。
Promise
コンストラクタに渡された関数の実行状況によって名前を分類することが出来る。
Settled
でない状態
Pending
引数として渡した関数 executor
が処理中の状態
Settled
である状態
つまり、今後変化しないとされる状態
Fulfilled
処理が成功した状態
resolve
関数を呼び出した状態。
then
メソッドの引数
onfulfilled
コールバック関数が呼び出される状況
Promise.resolve
静的メソッドでこの状態のオブジェクトを生成できる。
Rejected
処理が失敗した状態
reject
関数を呼び出した状態。
then
,
catch
メソッドの引数
onrejected
コールバック関数が呼び出される状況
Promise.race<T1,T2,T3,...>(promise:Promise[])
全ての渡された Promise
(非同期処理)を並行に実行するPromiseオブジェクトを返す。
最初に Settled
になった Promise
の状態がそのまま反映される。
タイムアウトなどはこれで表現できる。
一方は一定時間後に rejected
になるPromise、そのもう一方で通信処理などを行うPromiseを渡す。
一定時間内に処理が完成すれば fulfilled
一定時間を超えれば rejected
Promise.all<T1,T2,T3,...>(promise:Promise[])
こちらは全ての渡された Promise
(非同期処理)を並行に実行するPromiseオブジェクトを返す。
これ自体を Promise
として、上の状態のうちのどれかを持っているとして考えられる。
全て Settled
するまでこれ自体も Settled
にならない。
渡された Promise
の内、一つでも Rejected
の状態のものがあれば全て Settled
になった地点で Rejected
になる。
型定義を見ていると…結構強引な定義のされ方をしている。
9個までが望ましいらしい。
async
, await
って?<ES2017>
async
関数では、書かれた関数の処理を非同期処理として行う
無事に return
されればその値を resolve
関数の引数とした fulfilled
その中でエラーが起これば rejected
となるような
Promiseオブジェクトを戻り値とする。
await
式はそんな関数の中で使える。
await
の右辺にあるPromiseオブジェクトが Settled
となるまで、その非同期処理を停止する。
この式の評価値は
resolved
時は resolve
関数に渡された引数の値
rejected
時はエラーを投げる( new Error
)。
つまり、 try...catch
構文で捉えることが出来る!