nodeのPromiseの使い方考察
node.jsを使っていると、特にデータベースなんかを使っていると、callbackでのネストの深さに辟易してきます。
そんなときに活躍してくれるのがPromise。
検索してみると、記事は一杯出てるんですが、も一つ使い方が??だったんで、あれこれと試してみました。
目次
基本なソースのご紹介
こんなシーンを想定しています。
1)システムファイルを読み込む
2)セッションを開始する
3)更新する
4)エラー時の処理をする
5)セッションを開放する
6)後始末をする
コレを想定したソース(Express使っています)
※以下、基本ソースとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span style="font-size: 14pt;">router.get('/', function(req, res, next) {</span> <span style="font-size: 14pt;"> var trn = new Promise( function( resolve, reject ){</span> <span style="font-size: 14pt;"> console.log( "step1" );</span> <span style="font-size: 14pt;"> resolve();</span> <span style="font-size: 14pt;"> }).then( function() {</span> <span style="font-size: 14pt;"> return new Promise( function( resolve, reject ){</span> <span style="font-size: 14pt;"> console.log( "step2" );</span> <span style="font-size: 14pt;"> resolve();</span> <span style="font-size: 14pt;"> });</span> <span style="font-size: 14pt;"> }).then( function() {</span> <span style="font-size: 14pt;"> return new Promise( function( resolve, reject ){</span> <span style="font-size: 14pt;"> console.log( "step3" );</span> <span style="font-size: 14pt;"> resolve();</span> <span style="font-size: 14pt;"> });</span> <span style="font-size: 14pt;"> }).then( function() {</span> <span style="font-size: 14pt;"> console.log( "step4" );</span> <span style="font-size: 14pt;"> }).catch( function( error ) {</span> <span style="font-size: 14pt;"> console.log( "catch1:"+error );</span> <span style="font-size: 14pt;"> }).then( function() {</span> <span style="font-size: 14pt;"> console.log( "step5" );</span> <span style="font-size: 14pt;"> }).then( function() {</span> <span style="font-size: 14pt;"> console.log( "step6" );</span> <span style="font-size: 14pt;"> });</span> <span style="font-size: 14pt;">});</span> |
さて、やってみましょう!
基本形を実行すると。。。
$ node bin/www
step1
step2
step3
step4
step5
step6
問題なく全部通ってくれます。
Step2でrejectしてみると
step1
step2
catch1:step2 error
step5
step6
エラーメッセージが飛んでくれました!
Step2とStep3でResolveを取ってみると
step1
step2
おおお、step3以降へは進まないんだ。。。
Step4にRejectを入れてみると
step1
step2
step3
step4
catch1:ReferenceError: reject is not defined
step5
step6
おっと〜、イベントは飛ぶけど、メッセージがいかない。。
ふむ〜、Promiseでの逐次処理って便利なんですねぇ。。。