2017-07-25 8 views
0

ノードでreduxを実行しています。ファイルやディレクトリのリストを読み取るなどの非同期アクションを処理するために、私はredux-thunkをPromisesと組み合わせて使用​​しています。だから、一般的なアクションは、そのように見ることができます:Reduxグローバルエラーハンドラ

const 
    fs = require('fs'), 
    { promisify } = require('util'), 
    readdir = promisify(fs.readdir); 

const listFiles = dir => dispatch => 
    readdir(dir) 
    .then(files => dispatch({ 
     type: '…', 
     payload: { files } 
    })); 

だから:アクションは非同期であり、今、私はすべてのエラーを処理するために見る唯一の方法は、追加することですので、

try { 
    store.dispatch(listFiles('/some/path')); 

catch (error) { 
    //some rescue plan here, 
    //won't work if directory not exists 

} 

は文句を言わない、ここで働いa .catch()すべてのアクションのすべての約束をして、そこにエラーアクションをディスパッチします。 2つのマイナス面がある

  1. コードの繰り返しの多いと
  2. は、私は先のすべての可能性のあるエラーを知っておく必要があります。

私の質問は次のとおりです。非同期アクションが失敗した場合に呼び出されるグローバルエラーハンドラを作成する方法はありますか。表示できる状態に情報を示すエラーを追加することができます?

これは»storeEnhancer«またはいくつかの»ミドルウェアで可能でしょうか?

UPDATE

私は本当に役に立つものを見つけることができる:コールバックが約束を拒否されるたびにトリガされ、何のcatchブロックが追加されていないことを

process.on('unhandledRejection', (reason, promise) => { 
    console.log(reason.message); 
}); 

。今ではその縫い目は、トリックを行うには、とにかく、私は基本的に全く同じことを行うソリューションを好むだろうが、唯一の拒否された約束は、store.dispatch()の中でトリガーされているので、ときにのみアクション/ミドルウェア/レフィクス内で起こるようになる。

+0

[Promise.prototype.catch](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)を参照してください。 –

+0

@OriDroriそれは良い考えですが、プロトタイプをハッキングするのは痛みを感じます。なぜなら、おそらく私が望む以上に変化するかもしれないからです。 AKAノードの内部? – philipp

+0

プロトタイプをハックする必要はありません。リンクを見て、約束がどのように機能するかを見てください。 –

答えて

0

reduxミドルウェアソリューションをお探しの場合は、redux-catchをご覧ください。

+0

これは、Reduxのレデューサーと同期ミドルウェアのエラーキャッチャーミドルウェアですが、私は非同期アクションについても心配しています... – philipp

+0

ああ、そうです。 –

関連する問題