Если обещание может быть отклонено, то как мы должны справиться с этим или просто не справиться или не поймать его? - PullRequest
0 голосов
/ 06 января 2020

Если есть ситуации, когда обещание будет отклонено, из-за этого отклонения все равно будет выдано сообщение об ошибке. Как мы должны обращаться с этим или просто игнорировать его?

Случай 1: Если пользователь может нажать кнопку «Отмена», и операция отменяется, и мы считаем, что такая отмена в порядке, мы просто справимся с этим:

p.then(value => {
  // fulfillment handler
}, err => {});   // do nothing

или

p.then((value) => {
  // fulfillment handler
}).catch(err => {});     // do nothing

Или мы можем просто полностью игнорировать это и не использовать обработчик отклонения или catch ()?

Случай 2: Что если мы сделаем

let p = Promise.reject(1);

тогда исключение немедленно выдается. Нет времени даже ловить его. Тогда мы должны всегда использовать:

let p = Promise.reject(1).catch(err => {});

? На самом деле, если напечатано p выше, это решенное обещание, а без catch() - отклоненное обещание, поэтому я немного растерялся. Я думал, что оба должны быть в отклоненном состоянии.

1 Ответ

1 голос
/ 06 января 2020

Если вы используете отклонение / исключение обещания, чтобы сигнализировать о том, что что-то было отменено, имеет смысл уловить эту ошибку.

Но важное практическое правило заключается в том, что если вы поймаете ошибку и ожидаете выдается определенная ошибка (например, CancellationError), в предложении catch вы должны убедиться, что это именно ошибка этого типа.

В противном случае вы рискуете получить другое исключение брошенный и незаметно съеденный вашим (пустым) обработчиком catch.

Так что я обычно ожидаю, что это будет выглядеть примерно так:

try {
  await someOperation();
} catch (err) {
  if (!(err instanceof Cancellation)) {
    // Re-throw
    throw err;
  }
  console.log('Operation cancelled');
}
...