Одним из преимуществ промисов является более простая обработка ошибок. Для получения и обработки ошибки мы можем использовать
функцию catch() объекта Promise
, которая в качестве параметра принимает функцию обработчика ошибки:
const myPromise = new Promise(function(resolve, reject){ console.log("Выполнение асинхронной операции"); reject("Переданы некорректные данные"); }); myPromise.catch( function(error){ console.log(error); });
Функция catch() в качестве параметра принимает обработчик ошибки. Параметром этой функции-обработчика является то значение,
которое передается в reject()
.
Консольный вывод:
Выполнение асинхронной операции Переданы некорректные данные
Выше для извещения о возникшей ошибке вызывалась функция reject()
. Но стоит отметить, что ошибка может возникнуть и без вызова функции
reject()
. И если в выполняемой в промисе операции генерируется ошибка в силу тех или иных причин, то вся операция также завершается ошибкой.
Например, в следующем коде вызывается нигде не определенная функция getSomeWork()
:
const myPromise = new Promise(function(resolve){ console.log("Выполнение асинхронной операции"); getSomeWork(); // вызов не существующей функции resolve("Hello world!"); }); myPromise.catch( function(error){ console.log(error); });
Поскольку функция getSomeWork()
нигде не объявлена, то выполнение асинхронной задачи завершится ошибкой и не дойдет до вызова resolve("Hello world!")
.
Поэтому сработает функция обработки ошибок из catch()
, которая через параметр error получит информацию о возникшей ошибке, и
в консоли браузера мы увидим сообщение об ошибке:
Выполнение асинхронной операции ReferenceError: getSomeWork is not defined at index.html:39 at new Promise (<anonymous>) at index.html:37
Также ошибка может быть результатом вызова оператора throw, который генерирует ошибку:
cconst myPromise = new Promise(function(resolve, reject){ console.log("Выполнение асинхронной операции"); const parsed = parseInt("Hello"); if (isNaN(parsed)) { throw "Not a number"; // Генерируем ошибку } resolve(parsed); }); myPromise.catch( function(error){ console.log(error); });
Здесь парсится в число случайная строка. И если результат парсинга не представляет число, то с помощью оператора throw
генерируем ошибку.
Это придет к завершению всей функции с ошибкой. И в итоге результат будет обработан функцией catch
:
Выполнение асинхронной операции Not a number
В этом случае функция обработчика получает сообщение об оошибке, который указывается после оператора throw
.
Данная ситуация может показаться искуственной, так как нам нет смысла генерировать в коде выше ошибку с помощью throw, поскольку в этом случае мы также можем передать сообщение об ошибке в функцию reject:
if (isNaN(parsed)) { reject("Not a number"); }
Однако данный оператор может применяться во внешней функции, которую мы вызываем в коде:
function getNumber(str){ const parsed = parseInt(str); if (isNaN(parsed)) throw "Not a number"; // Генерируем ошибку else return parsed; } const myPromise = new Promise(function(resolve){ console.log("Выполнение асинхронной операции"); const result = getNumber("hello"); resolve(result); }); myPromise.catch( function(error){ console.log(error); });
Здесь парсинг строки в число вынесен во внешнюю функцию - getNumber
, однако при вызове этой функции в промисе, также из оператора throw возникнет ошибка.
И соответственно будет выполняться функция catch()
, где роизойдет обработка ошибки.
Как и в общем случае, операции, которые могут генерировать ошибку, можно помещать в конструкцию try..catch
, а при возникновении исключения в блоке catch вызывать функцию reject()
:
const myPromise = new Promise(function(resolve, reject){ try{ console.log("Выполнение асинхронной операции"); getSomeWork(); // вызов не существующей функции resolve("Hello world!"); } catch(err){ reject(`Произошла ошибка: ${err.message}`); } }); myPromise.catch( function(error){ console.log(error); });
Консольный вывод:
Выполнение асинхронной операции Произошла ошибка: getSomeWork is not defined
Кроме функции catch
для получения информации об ошибке и ее обработки также можно использовать функцию
then() - ее второй параметр представляет обработчик ошибки, который в качестве параметра получает переданное из функции
reject
значение:
promise .then(function(value){ // получение значения }, function(error){ // обработка ошибки });
Второй параметр функции then()
представляет функцию обработчика ошибок. С помощью параметра error
в функции-обработчика мы можем получить переданное в reject()
значение, либо информацию о возникшей ошибке.
Рассмотрим следуюший пример:
function generateNumber(str){ return new Promise(function(resolve, reject){ const parsed = parseInt(str); if (isNaN(parsed)) reject("значение не является числом") else resolve(parsed); }) .then(function(value){ console.log("Результат операции:", value);}, function(error){ console.log("Возникла ошибка:", error);}); } generateNumber("23"); generateNumber("hello");
В данном случае для того, чтобы в промис можно было передать разные данные, он определен как возващаемый результат функции generateNumber()
. То есть в данном случае консольный вывод будет следующим:
Результат операции: 23 Возникла ошибка: значение не является числом