Мой пример использования: я использую 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
при обработке его в более позднем промежуточном программном обеспечении.Какие-нибудь красные флаги для использования этого подхода?