Как определить, находится ли блок catch в Promise - PullRequest
0 голосов
/ 28 марта 2019

Я написал несколько нелепо простой код обработки ошибок, который безупречно работает с синхронными операциями.Мне пришлось изменить функцию 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.

Этот вопрос трудно написать по какой-то причине и, вероятно, он сформулирован довольно странно, я был бы признателен за любые уточняющие правки.

1 Ответ

0 голосов
/ 29 марта 2019

Проблема с:

Но если вы поместите асинхронный код throwError в код синхронизации, будет запущен второй файл console.log. Если вы поместите синхронизирующий throwError в асинхронный код, он выдаст ошибку отклонения необязательного обещания.

Возможно ли, что некоторые вещи должны быть разъяснены заранее, две написанные вами функции throwError делают совершенно разные вещи, когда одна получает ошибку и выдает ее, а другая просто регистрирует 'Бла л '.

С другой стороны в коде

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 на первую, то код будет выглядеть так:

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
   throw 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)
}

И здесь происходит следующее: после отклонения loadStuff выполняется функция throwError, которая выдает ошибку, но она не будет перехвачена в операторе try / catch как операторы в try не выдавайте ошибку, так как loadStuff просто возвращает обещание, то, что происходит в перехвате loadStuff, не имеет ничего общего с перехватом try / catch , так как имеет другую scope, На самом деле оба захвата могут быть выполнены одновременно, если они написаны так:

const errorHandler = () => console.log('Blah blah')
const throwError = (error) => {
   console.log('another catch')
   throw error
}

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(throwError)
  throw new Error('my Error')
} catch(error) {
  errorHandler(error)
}

Сказав это и предполагая каждый раз, когда выдается ошибка, вы хотите обрабатывать ее так же, как возможное решение - просто написать ее так:

const errorHandler = () => console.log('Blah blah')

const loadStuff = () => new Promise((_, reject) => {
  console.log('Loading stuff')
  setTimeout(() => reject(new Error('Oh no, an error!')), 1000)
})

try {
  loadStuff().catch(errorHandler)
} catch(error) {
  errorHandler(error)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...