Вы должны знать, что при выполнении функции async
она всегда возвращает обещание , независимо от условия выхода из функции.
Если функция имеет явное return
(или завершается без сбоя), обещание будет разрешено до возвращенного значения (или до undefined
, если явного возврата не было), если Функция throws, обещание будет отклонено, передав брошенный объект error.
Зная, что вы можете просто обработать ошибку при использовании функции, например:
const apiURL = 'https://jsonplaceholder.typicode.com/todos/1';
const badURL = 'zhttps://wcaf.fajfkajf.gg'
async function getData(url){
const response = await fetch(url);
return await response.json();
}
getData(apiURL).then(data => console.log(data));
getData(badURL).catch(err => console.log('error:', err));
ИМХО тщательное рассмотрение ошибки там, где у вас есть сценарий использования функции, имеет больше смысла, поскольку обычно, когда вы ожидаете, что ошибка возникла, потому что у нас есть способ ее обработки (возможно, попробуйте другой URL API в этом примере) .
Один шаблон, который я использовал в последнее время, состоит в том, чтобы обернуть обещания так, чтобы они разрешали возвращать кортеж, в соответствии с соглашением [error, value]
(аналогично тому, как язык программирования Go обрабатывает асинхронную ошибку), таким образом, для Например, вы можете обработать ошибку в конкретном вызове getData
, например:
const apiURL = 'https://jsonplaceholder.typicode.com/todos/1';
const badURL = 'zhttps://wcaf.fajfkajf.gg'
async function getData(url){
const response = await fetch(url);
return await response.json();
}
// simple utility function
const safePromise = promise =>
promise.then(data => [null, data]).catch(err => [err, undefined]);
(async () => {
const [err, json] = await safePromise(getData(apiURL))
if (err) {
// handle the error
}
console.log(json)
const [error, data] = await safePromise(getData(badURL))
if (error) {
console.log('Error:', error);
}
})()
Проверьте следующую библиотеку, которая в основном поставляет этот шаблон: