Promiseとcatchの良い書き方

2016.06.02.木
JavaScript

今回は、JavaScriptのPromiseについての紹介と、Promiseを使っていると困る「例外時のエラー出力」について書きます。

Promiseとは

Promiseは非同期処理を分かりやすく記述するために使われるものです。

例えば、Node.jsで3つのファイルを読み込むような場合を考えます。ひとつ前のファイルの内容を使って次のファイルを読み込むイメージです。

この場合、readFileSyncを使うなどの回避ができると思いますが、Promiseの説明のため非同期処理で行います。

まずは、Promiseを使わずに書いてみます。

このように非同期処理で読み込みを行おうとすると、ネストが深くなり見づらいという欠点があります。

そこで、Promiseを使うとネストを深くせずに非同期処理を記述できます。

気をつけなければいけない点として、catchの記述忘れがあります。catchで指定した関数はPromiseの中で例外が起きた場合に呼ばれます。

これを記述しないと、例外が起きたことを知るすべがなく、コンソールなどにもなにも出力されません。

例外時のエラー出力

catchで例外を知ることはできますが、スタックトレースを通常の例外が投げられたときのようにコンソールへ出力する場合、一工夫が必要です。

process.nextTickもしくはsetTimeout(もしくはlodashのdefer)を使うことで、通常のようにエラーを再送できます。

以下のようにconsole.errorで出力した場合はスタックトレースが表示されないため、デバッグをすることが難しいです。

これに対して、以下のようにsetTimeoutを使うことで、通常の例外発生時と同じように、スタックトレースのエラーを表示することができます。

このようなエラー出力になります。

他にも以下のような関数で同じことができます。利用しているライブラリや環境に合わせて使い分けてください。

詳しくPromiseについて知りたい場合は、Promise - JavaScript | MDNが参考になります。




キー・ポイントでは、
「ネスト深くなったな」で思考を放置しないエンジニアを募集しています。
2017新卒の方はリクナビ2017へ ( 第2弾選考 エントリー受付中です )
中途の方はコチラへ