8 июля 2024 г. (изменено: 8 июля 2024 г.)
Канал: @cherkashindev
function(): Promise 🆚 async function(): Promise
Существует небольшая, но довольно важная разница между функцией, которая просто возвращает промис, и функцией, которая была объявлена с помощью ключевого слова async.
Пример
function fn(obj) {
const someProp = obj.someProp
return Promise.resolve(someProp)
}
async function asyncFn(obj) {
const someProp = obj.someProp
return Promise.resolve(someProp)
}
asyncFn().catch(err => console.error('Catched')) // => 'Catched'
fn().catch(err => console.error('Catched')) // => TypeError: Cannot read property 'someProp' of undefined- при объявлении функции с ключевым словом
asyncJavaScript гарантирует, что функция вернётPromise, даже если в ней произошла ошибка - если функция возвращает
Promise, но объявлена безasyncтоcatchне поймает ошибку, если в функции произошла ошибка - дело в том, что ошибки произошедшие внутри конструктора
new Promise((resolve, reject) => { throw new ... })промиса ловятся. Когда мы добавляемasync, то по сути заворачиваем тело функции вnew Promise((resolve, reject) ⇒ { })
То есть, чтобы сделать функции из примера идентичными, нужно завернуть первую функцию в промис.
function fn(obj) {
return new Promise((resolve, reject) => {
const someProp = obj.someProp;
resolve(someProp);
});
} 👍 23 🔥 5 ❤ 4