node.jsに関する記事一覧→ http://morakana.hatenablog.jp/entry/2018/03/09/174557
前回の内容のおさらいです、
「new Promise()」で作った Promiseのインスタンスの内部の結果を受けるのは「then」で それを受けた thenが返すのも Promiseのインスタンスでした ならば、 thenが返したPromiseのインスタンスも 同じくthenで繋いでいける
ということでしたね
では thenからthen へ繋ぐ場合を具体的にどう書くのかを見ていきます
「new Promise()」 で Promiseのインスタンスを作る時には
prms1 = new Promise( (resolve, reject)=>{ resolve('hello'); } );
こんな感じでしたね(簡素化のために成功時の処理しか書いていません)
そして、 Promsieのインスタンスに .thenとして繋ぐことで
Promise内の処理が 成功した時と失敗した時の2ルートで結果を取得することになります
prms2 = prms1.then( (val)=>{ return(Promise.resolve(val + ' world')); } );
ここも簡素化のために成功時のみを書いています
さて、ここでちょっと見慣れない「return Promise.resolve()」というものが出てきました
大方の察しは付くと思いますが
これが「次のthenへ成功時の結果を渡すもの」ということになります
同様に『失敗時だったら「return Promise.reject()」だろうな』と想像できますね
では、ここまでの内容を纏めて、一つ目のthenが渡してきた値を、二つ目のthenで受けて表示させてみます
prms1 = new Promise( (resolve, reject)=>{ resolve('hello'); } ); prms2 = prms1.then( (val)=>{ return(Promise.resolve(val + ' world')); } ); prms2.then( (val)=>{ console.log(val); } );
「hello world」という表示になったと思います
今回はほぼ即時に実行終了するので実感が無いと思いますが
「hello」という結果が3秒後に出た場合でも それまでは val + ' world'という処理は行われませんし val + ' world' という処理に5秒かかったとしても その結果が出るまでは 「hello world」とは表示されない
ということです
ちなみに・・・・
thenの戻り値が Promiseのインスタンスということは
「Promise.resolve()」の戻り値が Promiseのインスタンスということになるだろうし
「return Promise.resolve()」の所は 「return new Promise()」でも書けるはずですよね?
つまり
prms1 = new Promise( (resolve, reject)=>{ resolve('hello'); } ); prms2 = prms1.then((val)=>{ return(new Promise( (resolve, reject)=>{ resolve(val + ' world');})); }); prms2.then( (val)=>{ console.log(val); } );
とも書けるわけです、というか同じ意味になります
「Promise.resolve()」 は 「『new Promise()』の成功時(resolve)の部分」に相当するわけです
同じく失敗時なら 「Promise.reject()」 は 「『new Promise』の失敗時の部分」ということですね
相当するとはいえ「new Promise()」で書こうとすると構造的にもかなり煩雑な形になってしまうので
「Promise.resolve()」「Promise.reject()」の方を使った方がいいかと思います。