Является ли проверяемое обещание. Поймать анти-образец? - PullRequest
0 голосов
/ 02 апреля 2019

Мой пример использования: я использую redux-thunk и пользовательское промежуточное программное обеспечение для редукции для извлечения API, и использую Formik для быстрого написания форм (на сайте моего клиента есть сотни форм).

Я хочу иметь возможность: 1) обрабатывать ошибки с помощью promise.catch внутри Formik, и 2) если ошибка НЕ ​​обрабатывается в Formik, иметь промежуточное программное обеспечение, перехватывающее ошибку (ТОЛЬКО если ошибка имеетеще не был пойман).

Проблемы:

  • Собственные обещания не могут определить, был ли вызван .catch для них
  • Синяя птица имеет .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 при обработке его в более позднем промежуточном программном обеспечении.Какие-нибудь красные флаги для использования этого подхода?

...