Ошибка при сборе обещаний
В учебнике я нашел следующий код:
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
Я немного смущен: делает ли вызов catch что-нибудь? Мне кажется, что это не имеет никакого эффекта, поскольку оно просто бросает ту же ошибку, которая была поймана. Я основываю это на том, как работает регулярный try/catch.
Ответы
Ответ 1
Нет смысла гонять и бросать, пока вы показываете. Он не делает ничего полезного, кроме добавления кода и медленного выполнения. Итак, если вы собираетесь в .catch()
и ретронировать, в .catch()
должно быть что-то, что вы хотите сделать, иначе вы просто должны полностью удалить .catch()
.
Обычной точкой для этой общей структуры является то, что вы хотите выполнить что-то в .catch()
, например, занести в журнал ошибку или очистить некоторое состояние (например, закрыть файлы), но вы хотите, чтобы цепочка обещаний продолжала отклоняться.
promise.then(function(result){
//some code
}).catch(function(error) {
// log and rethrow
console.log(error);
throw error;
});
В учебнике может быть просто показать людям, где они могут поймать ошибки, или научить концепции обработки ошибки, а затем переделать ее.
Ответ 2
Нет существенной разницы, если полностью отказаться от метода метода catch
.
Единственное, что он добавляет, - это дополнительная микротаска, которая на практике означает, что вы заметите отказ от обещания позже, чем в случае обещания, которое выходит из строя без предложения catch
.
Следующий фрагмент демонстрирует это:
var p;
// Case 1: with catch
p = Promise.reject('my error 1')
.catch(function(error) {
throw(error);
});
p.catch( error => console.log(error) );
// Case 2: without catch
p = Promise.reject('my error 2');
p.catch( error => console.log(error) );
Ответ 3
Итак, похоже, ваш вопрос: "В цепочке обещаний, что делает метод .catch()?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw
Оператор throw останавливается (инструкции после того, как бросок не будет выполнен), и управление будет передано в первый блок catch в стеке вызовов. Если между функциями вызывающего абонента не существует блокировки catch, программа завершится. "
В цепочке обещаний метод .then() вернет некоторый тип блока данных. Это возвращение куска завершает обещание. Успешное возвращение данных завершает обещание. Аналогичным образом вы можете думать о методе .catch()..catch(), однако, будет обрабатывать неудачные данные. Заявление о выполнении завершает обещание. Ocassionaly, вы увидите, что разработчики используют .catch((err) = > {console.log(err))}, который также завершил бы цепочку обещаний.
Ответ 4
Оба метода .then()
и .catch()
возвращают Promises, и если вы выкидываете исключение в любом обработчике, возвращаемое обещание отклоняется и исключение будет обнаружено в следующем обработчике отклонения.
В следующем коде мы бросаем исключение в первый .catch()
, который попадает во второй .catch()
:
new Promise((resolve, reject) => {
console.log('Initial');
resolve();
})
.then(() => {
throw new Error('Something failed');
console.log('Do this'); // Never reached
})
.catch(() => {
console.log('Something failed');
throw new Error('Something failed again');
})
.catch((error) => {
console.log('Final error : ', error.message);
});