Я написал несколько нелепо простой код обработки ошибок, который безупречно работает с синхронными операциями.Мне пришлось изменить функцию throwError
, чтобы она работала так, как я хочу с асинхронными операциями, но теперь она не работает, как я ожидаю, с синхронными операциями.Как я могу определить, вызывается ли функция в блоке перехвата Promise или нет, чтобы изменить поведение?
Вот код, который хорошо работает для операций синхронизации:
const errorHandler = () => console.log('Woot, handled error')
const throwError = (error) => {
throw error
}
try {
throwError(new Error('Blah blah'))
console.log('This should not be reached')
} catch(error) {
errorHandler(error)
}
Вот код, который отлично подходит для асинхронных операций:
const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
errorHandler(error)
}
const loadStuff = () => new Promise((_, reject) => {
console.log('Loading stuff')
setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})
try {
loadStuff().catch(throwError)
} catch(error) {
errorHandler(error)
}
Но если вы вставите асинхронный код throwError
в код синхронизации, будет запущен второй файл console.log.Если вы поместите синхронизацию throwError
в асинхронный код, она выдаст ошибку отклонения необязательного обещания.
Как я могу, с помощью только одной функции throwError
, узнать, перехватывает ли он обещание или вызывается вручную для переключениямежду вызовом errorHandler
напрямую и throw
с ошибкой?Предположим, что только throwError
и последнее предложение catch
могут получить доступ к errorHandler
.
Этот вопрос трудно написать по какой-то причине и, вероятно, он сформулирован довольно странно, я был бы признателен за любые уточняющие правки.