(node.js)(javascript)(promise) thenからthenへ値を渡せるようになろう

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()」の方を使った方がいいかと思います。