Как я могу "бросить" внутрь метода "catch" из отклоненного обещания, которое будет обрабатываться внешним "bock"? - PullRequest
1 голос
/ 13 марта 2020

Это работает!

function rejectedPromise() {
  return Promise.reject("ERROR");
}

async function someFunction() {
  try {
    rejectedPromise()
    .catch((err) => console.log(err));   // IT WORKS ! THE ERROR IS BEING LOGGED HERE
  }
  catch(err) {
    console.log(err);
  }
}

someFunction();

Это не так.

function rejectedPromise() {
  return Promise.reject("ERROR");
}

async function someFunction() {
  try {
    rejectedPromise()
    .catch((err) => { throw err; });      // CAN'T I THROW HERE ?
  }
  catch(err) {
    console.log(err);                     // DOES NOT WORK. THE ERROR SHOULD BE LOGGED HERE
  }
}

someFunction();

ВОПРОС

Почему?

Примечание: моя цель - throw ошибка от catch метод отклоненного обещания и throw его, так что он обрабатывается внешним блоком catch. Не знаю, имеет ли это значение, но это происходит внутри функции async (в любом случае, если я уберу ключевое слово async из примера, это не сработает).

EXTRA:

В Node я получаю следующее (даже при наличии блока перехвата):

UnhandledPromiseRejectionWarning: Необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри asyn c -функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификационный номер отклонения: 1)

1 Ответ

1 голос
/ 13 марта 2020

Как указано в комментариях, нет необходимости использовать .catch(), если вы находитесь внутри функции async. Я не знаю, почему вы хотите вложить try...catch, но похоже, что это даст то, что вы хотите:

function rejectedPromise() {
  return Promise.reject("ERROR");
}

async function someFunction() {
  try {
    try {
      await rejectedPromise()
    } 
    catch(err) {
      throw err;
    }
  }
  catch(err) {
    console.log(err);
  }
}

someFunction();
...