我的用例:我正在使用redux-thunk和自定义的redux中间件进行api获取,并使用Formik来快速编写表单(我的客户的站点有数百个表单)。
我希望能够1)通过Formik内部的promise.catch处理错误,以及2)如果错误不是在Formik中处理的,请以后的中间件捕获该错误(仅当该错误尚未被捕获时) )。
问题:
.catch
进行调用.isFulfilled
,.isRejected
,.isPending
和.isCancelled
同步检查方法,但没有.isCaught
可能的解决方案:
我提出了以下内容,但想知道这种方法是否有任何警告。我想不起来。
此解决方案很大程度上基于this tutorial。
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
这似乎满足了我的需求-我可以确定在以后的中间件中处理Promise时是否已经调用了.catch
。有没有使用这种方法的危险信号?