redux - 可检查的 promise.catch 是反模式吗?
问题描述
我的用例:我使用redux-thunk和自定义 redux 中间件进行 api 获取,并使用Formik快速编写表单(我客户的网站有数百个表单)。
我希望能够 1)通过 Formik 内部的 promise.catch 处理错误,以及 2)如果错误未在 Formik 中处理,则让稍后的中间件捕获错误(仅当错误尚未被捕获时)。
问题:
- 原生 Promise 无法确定是否
.catch
已调用它们 - Bluebird有
.isFulfilled
,.isRejected
,.isPending
, 和.isCancelled
同步检查方法,但没有.isCaught
可能的解决方案:
我想出了以下内容,但想知道这种方法是否有任何警告。我什么都想不出来。
此解决方案主要基于本教程。
function inspectable(promise) {
let isHandled = false;
let isFulfilled = false;
const result = {
then: (fnc) => (promise.then(data => {
isFulfilled = true;
return Promise.resolve(data);
})).then(fnc),
catch: (fnc) => (promise.catch(err => {
isHandled = true;
isFulfilled = true;
return Promise.reject(err);
})).catch(fnc)
};
result.isHandled = () => isHandled;
result.isFulfilled = () => isFulfilled;
return result;
}
然后运行以下测试会给出以下结果:
const x = inspectable(Promise.reject('reject me'));
x.isHandled();
>> false
x.catch(err => {
// suppress errors
});
setTimeout(() => console.log(x.isHandled()), 10);
>> true
setTimeout(() => console.log(x.isFulfilled()), 10);
>> true
这似乎给了我我需要的东西 - 我可以确定.catch
在以后的中间件中处理它时是否已经调用了 Promise。使用这种方法有什么危险信号吗?
解决方案
推荐阅读
- javascript - 引导表模板不匹配
- c# - 如何在 asp.net core razor 页面中拒绝匿名用户?
- python - 如何删除链表中加起来为0的连续元素
- docker - 无法在 Linux 上使用 ElasticSearch 映射日志存储
- java - 自定义键盘中的 Android Speech to Text 功能
- mysql - mysql更新语句执行
- react-native - 尝试使用 Open Tok React Native 库时出错,otk_anvil.cpp:467
- mysql - kafka连接器更新rest api不更新接收器数据
- node.js - 使用聚合的计数总数
- python - 我们可以在python中将keras模型保存为二进制文件吗?