首页 > 解决方案 > 可检查的 promise.catch 是反模式吗?

问题描述

我的用例:我使用redux-thunk和自定义 redux 中间件进行 api 获取,并使用Formik快速编写表单(我客户的网站有数百个表单)。

我希望能够 1)通过 Formik 内部的 promise.catch 处理错误,以及 2)如果错误未在 Formik 中处理,则让稍后的中间件捕获错误(仅当错误尚未被捕获时)。

问题:

可能的解决方案:

我想出了以下内容,但想知道这种方法是否有任何警告。我什么都想不出来。

此解决方案主要基于本教程

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。使用这种方法有什么危险信号吗?

标签: reduxerror-handlingpromisemiddleware

解决方案


推荐阅读