Promise
概説
code:js
let 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構文で捉えることが出来る!