2017-02-10 4 views
17

Я нашел следующий код в учебнике:Повторного выбрасывание ошибки в обещании улове

promise.then(function(result){ 
    //some code 
}).catch(function(error) { 
    throw(error); 
}); 

Я немного запутался: вызов поймать достичь ничего? Мне кажется, что это не имеет никакого эффекта, поскольку оно просто бросает ту же ошибку, которая была поймана. Я основываю это на том, как работает регулярный try/catch.

+0

Не могли бы вы предоставить ссылку на учебник? Может быть, есть дополнительный контекст, который был бы полезен ... – Igor

+0

@Igor Я не могу, это на Pluralsight. Возможно, это просто местозаполнитель для некоторой логики передачи ошибок? –

+0

Это то, что я бы предположил, поскольку он ничего не делает, а затем передает ошибку вместе с вызывающим, которая также может быть достигнута, если не иметь улов для начала. – Igor

ответ

23

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

Обычной точкой для этой общей структуры является то, что вы хотите выполнить что-то в .catch(), например, зарегистрировать ошибку или очистить некоторое состояние (например, закрыть файлы), но вы хотите, чтобы цепочка обещаний продолжала отклоняться.

promise.then(function(result){ 
    //some code 
}).catch(function(error) { 
    // log and rethrow 
    console.log(error); 
    throw error; 
}); 

В учебнике, может быть там, чтобы показать людям, где они могут поймать ошибки или научить концепцию обработки ошибки, то это Повторное выбрасывание.

+0

По-моему, это хороший пример. При таком подходе вы легко получаете несколько протоколов для 1 ошибки. В java вы можете просто «выкинуть новое исключение (periousException)», я не знаю, поддерживает ли javascript вложенную ошибку, но в любом случае «log and throw» - это плохая практика. – Cherry

+4

@Черри - Вы не можете сказать, что это плохая практика в целом. Бывают моменты, когда модуль хочет самостоятельно регистрировать собственные ошибки, и это один из способов сделать это. Кроме того, я не рекомендую это, я просто объясняю, что нет причин иметь '.catch()' и бросать ту же ошибку внутри catch, если вы не делаете SOMETHING else в '.catch()'. Вот в чем смысл этого ответа. – jfriend00

2

Так звучит, как ваш вопрос: «В цепочке обещаний, что делает метод .catch()?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

Оператор бросок «остановится (заявления после броска не будут выполняться), и управление будет передано в первый блок поймать в стеке вызовов. Если не поймать блок не существует среди функций абонентов , программа завершится ».

В цепочке обещаний метод .then() возвращает некоторый тип блока данных. Это возвращение куска завершает обещание. Успешное возвращение данных завершает обещание. Аналогичным образом вы можете думать о методе .catch(). .catch(), однако, будет обрабатывать неудачные данные. Заявление о выполнении завершает обещание. Ocassionaly, вы увидите, что разработчики используют .catch ((err) => {console.log (err))}, который также завершил бы цепочку обещаний.

3

Нет существенной разницы, если полностью отказаться от метода вызова 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));

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

+0

фрагмент работает отлично. Тем не менее, услуга недоступна сейчас .. check: http://meta.stackoverflow.com/a/337257/747579 –

2

Оба метода .then() и .catch() возвращают обещания, и если вы выбрали исключение в любом обработчике, возвращаемое обещание будет отклонено, а исключение будет обнаружено в следующем обработчике отклонения.

В следующем коде мы выбрасываем исключение в первом .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); 
 
});

Второй .catch() возвращает обетованную, который выполняется, .then() можно назвать:

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); 
 
}) 
 
.then(() => { 
 
    console.log('Show this message whatever happened before'); 
 
});

Полезные ссылки: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch

Надеется, что это помогает!