АКЦИЯ: бесплатные месячные курсы по созданию сайтов
на выбор: верстка, JavaScript, PHP или фреймворки. Сегодня последний день для записи! Жми!
⊗jsSpPrmChE 169 of 294 menu
Долгожданный Бесплатный курс по выкладке сайта на хостинг. МЫ УЖЕ НАЧАЛИ! Присоединяйтесь к нам!

Исключения в цепочках промисов в JavaScript

Пусть по каким-то причинам наш промис завершится с ошибкой:

let promise = new Promise(function(resolve, reject) { setTimeout(function() { reject('error'); }, 3000); });

В этом случае выполнение кода сразу перейдет к тому then, в котором есть функция-обработчик ошибки, либо в первому catch, смотря что встретится раньше.

Вот пример первой ситуации:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; }, function(error) { // выполнение сразу перейдет сюда } ).then( function(result) { console.log(result); } );

Вот пример второй ситуации:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { // выполнение сразу перейдет сюда } ).then( function(result) { console.log(result); } );

Функция-обработчик имеет два варианта действий: если она справилась с исключительной ситуацией, то может вернуть результат через return и выполнение продолжится дальше по цепочке. Если же она не справилась с ошибкой, то может или ничего не возвращать, или выбросить исключение через throw. В этом случае выполнение перейдет к следующему перехватчику ошибки (в then или catch - что встретится раньше).

Как правило, все ошибки цепочки перехватываются в одном месте: в конце цепочки размещается catch:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { // попадем сюда в случае ошибки } );

При этом исключение может возникнуть в самом промисе, либо выброшено через throw в любом звене цепочки:

promise.then( function(result) { return result + '1'; } ).then( function(result) { if (всеХорошо) { return result + '2'; } else { throw new Error('ошибка'); // переходим к ближайшему перехватчику } } ) .then( function(result) { return result + '3'; } ).catch( function(error) { // ближайший перехватчик } );

Учтите, что catch нужен именно для диагностики ошибки: она решаема или нет. Если ошибка решаема, то catch должен передать ее решение следующему за собой then. А если не решаема (или данный catch просто не знает как ее решить), то мы должны или ничего не вернуть или бросить исключение:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { if (ошибкаРешаема) { return 'данные'; // отправляем на следующий then } else { // ничего не возвращаем или бросаем исключение } } ).then( function(result) { // тут решаем ошибку } );
enru