2017-07-25 123 views
0

我在节点上运行REDX。为了处理异步操作,如读取文件或目录列表,我将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 

} 

不会在这里工作,因为动作是异步的,现在,我看到处理所有的错误的唯一方法是添加一个.catch()所有行动的承诺,并在那里派遣错误行动。

有两个缺点:

  1. 大量的代码重复和
  2. 我需要知道在未来所有可能的错误。

所以我的问题是:有什么办法来创建一个全局错误处理程序,如果异步操作失败,也会被调用,这样我可以添加一些错误指示信息的状态,它可以显示?

用»storeEnhancer«或一些»中间件«可以实现吗?

UPDATE

我能找到的东西是真正有用的:

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

,每当承诺被拒绝回调被触发,不添加catch块。现在,接缝可以做到这一点,不过无论如何,我更喜欢一个基本上完全相同的解决方案,但只适用于在store.dispatch()内触发的被拒绝的Promise,所以只有在动作/中间件/减速器处理中发生错误时在redux内即将发生。

+0

看看[Promise.prototype.catch](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)。 –

+0

@OriDrori这是一个好主意,但对'prototype'进行黑客攻击会感觉很痛苦,因为我可能会比我想要的更多。 AKA内部节点? – philipp

+0

你不需要破解原型。去链接,看看承诺的承诺如何工作。 –

回答

0

如果您正在寻找redux中间件解决方案,请查看redux-catch

+0

这是一个»错误捕获中间件的Redux减速器和同步中间件«,但我也担心异步操作... – philipp

+0

啊,你说得对。 –