【发布时间】:2023-04-04 22:03:01
【问题描述】:
我在节点上运行 redux。为了处理异步操作,例如读取文件或目录列表,我将redux-thunk 与 Promises 结合使用。所以一个典型的动作可以是这样的:
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« 或一些 »middleware« 实现吗?
更新
我可以找到一些真正有用的东西:
process.on('unhandledRejection', (reason, promise) => {
console.log(reason.message);
});
只要 Promise 被拒绝并且没有添加 catch 块,就会触发该回调。现在,接缝可以解决问题,但无论如何,我更喜欢一个基本上做同样事情的解决方案,但仅适用于在store.dispatch() 内触发的被拒绝承诺,所以只有在处理动作/中间件时出现错误/reducers 在 redux 中发生。
【问题讨论】:
-
@OriDrori 这是一个好主意,但是破解
prototype感觉有点痛苦,因为我可能会做出比我想要的更多的改变。又名 Node 内部?? -
你不需要破解原型。转到该链接,看看 catch for promises 是如何工作的。
标签: error-handling redux