是可检查的promise.catch反模式吗?

时间:2019-04-02 13:47:00

标签: redux error-handling promise middleware

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

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

问题:

  • 本国承诺无法确定是否已对其.catch进行调用
  • Bluebird具有.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。有没有使用这种方法的危险信号?

0 个答案:

没有答案