JS/ES – Promise

非同期実行の簡単な例

以下の例では2つのブロックが非同期に実行され、コードが書かれた順番ではなく実行時間の短い順に出力される。

Promiseによる実行順序の保証

基本形

Promiseオブジェクト.then()

この基本形では、以下の手順で処理間を同期させる。

  1. Promiseオブジェクト生成
    • 生成時の引数で渡す無名関数に先行処理を記述
    • 無名関数の引数で処理終了を発行する関数(resolve)を受け取り
    • 先行処理終了のところでresolve関数を実行
  2. Promiseオブジェクトのthenメソッドを記述
    • thenメソッドの引数で渡す無名処理に後続処理を記述
    • この後続処理は、先行処理のresolve関数が実行された後に実行される

処理完了のための関数名は任意だが、staticメソッドと同じ関数名のresolveが使われる。

以下の例では、Promise・・・・・・・・・・・・・無名関数の引数をresolveとして受け取り、resolve関数を300ms待機後の表示の後に実行している。

そしてその実行後に100ms待機の処理が実行される。

Promiseオブジェクトのthenメソッドには引数に無名関数を指定する。Promiseオブジェクトで設定したresolveメソッドが実行された後に引数の無名関数が実行される。

以下の例では、上のPromiseオブジェクトで設定した300ms待機後の表示の後に、thenメソッドで設定した100ms待機・表示が実行される。

new Promise~then

生成したPromiseオブジェクトから直接thenメソッドを実行してもよい。

Promiseオブジェクトを返す

優先実行させたい処理をPromiseオブジェクトとして、そのインスタンスを関数の戻り値とする書き方。関数にthenメソッドが適用できる。

resolveで値を渡す

resolve関数に引数を渡し、これをthenメソッドで受け取ることができる。

thenのチェイン

thenメソッドを連ねてシリアルに実行させる書き方。後続を持つthenメソッドの戻り値をPromiseオブジェクトとするのがミソ。

reject

Promiseの処理で何らかの問題が生じた場合にrejectすることができる。この場合、resolveが実行されないのでthenは処理されず、直近のcatchが呼ばれる。

以下の例ではPromiseオブジェクトで300msのブロックの最後でrejectが実行され、thenメソッドは実行されずにcatchメソッドが実行される。

 

Promise.all~全ての実行を待機

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です