我在节点上运行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()
所有行动的承诺,并在那里派遣错误行动。
有两个缺点:
- 大量的代码重复和
- 我需要知道在未来所有可能的错误。
所以我的问题是:有什么办法来创建一个全局错误处理程序,如果异步操作失败,也会被调用,这样我可以添加一些错误指示信息的状态,它可以显示?
用»storeEnhancer«或一些»中间件«可以实现吗?
UPDATE
我能找到的东西是真正有用的:
process.on('unhandledRejection', (reason, promise) => {
console.log(reason.message);
});
,每当承诺被拒绝回调被触发,不添加catch块。现在,接缝可以做到这一点,不过无论如何,我更喜欢一个基本上完全相同的解决方案,但只适用于在store.dispatch()
内触发的被拒绝的Promise,所以只有在动作/中间件/减速器处理中发生错误时在redux内即将发生。
看看[Promise.prototype.catch](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)。 –
@OriDrori这是一个好主意,但对'prototype'进行黑客攻击会感觉很痛苦,因为我可能会比我想要的更多。 AKA内部节点? – philipp
你不需要破解原型。去链接,看看承诺的承诺如何工作。 –