Ппромисы, async/await и возврат значения
Добрый день, прошу помощи - пытаюсь разобраться в том, как использовать async-await и обработку ошибок.
У меня есть такой класс, а в нем несколько методов для получения удаленных данных. Можно или один метод запрашивать или в Promise.all сразу несколько, что по задумке удобно. А как возвращать значения и отлавливать ошибки? class MyHelper { <...> async getBook(id: number): Promise<any> { let response = await fetch(this.getUrl() + 'GetBook'); if (!response.ok) { const message = `An error has occurred: ${response.status} - ${response.statusText}`; throw new Error(message); } return await response.json(); } async getApple(id: number): Promise<any> { <...> } } А вот в такой функции я использую этот класс-хелпер и мне надо вернуть в этой функции данные: чтобы не было then, а был await, то сделал ее async (+ try-catch для попытки отлова ошибок): async function createData(data: number[]): Promise<any> { <всякие разные действия> let data: any; let serv = new MyHelper(); try { data = await serv.getBook(1); } catch (e) { console.log(e); return null; } <всякие разные действия> return data; } И теперь вызов createData, но тут мне приходит Промис, а это значит снова await или then-catch? function fillData() { <...> let data = createData([1,2,3]); if (data !== null) { } } Надеюсь не путанно получилось объяснить) Спасибо. |
Цитата:
async function fillData() { <...> let data = await createData([1,2,3]); if (data !== null) { } } Или function fillData() { <...> createData([1,2,3]).then(data =>{ if (data !== null) { } }) } C ошибками сложнее. Отлавливать ошибки нужно или в самом конце, или исправлять их так, что бы можно было работать дальше. Или передавать дальше именно саму ошибку. Можно так async function createData(data: number[]): Promise<any> { <всякие разные действия> let data: any; let serv = new MyHelper(); data = await gs.getBook(1); <всякие разные действия> return data; } function fillData() { <...> try { let data = createData([1,2,3]); } catch (err) { console.log(err) // либо return - выдали сообщение и ничего не делаем // либо throw ('Произошла фатальнейшая ошибка') // и где то дальше ее отлавливать } if (data !== null) { } } |
Цитата:
let arv =await Promise.all ( [ getBook(id), getApple(id) ]) // когда все промисы исполнятся а arv будет массив значений //Или значение первого отклоненного Есть еще функция allSettled https://developer.mozilla.org/ru/doc...ise/allSettled, она всегда возвращает массив из значений или причин отконений. Смотрите, что удобнее. |
Спасибо!
|
А правильно, что для allSettled не нужен try-catch? Все ошибки у нас будут в переменных массива результатов? Или и в allSettled что-то может случиться?
class MyHelper { async getBook(id: number): Promise<any> { let response = await fetch('/GetBook/' + id); return await response.json(); } async getApple(id: number): Promise<any> { let response = await fetch('/GetApple/' + id); return await response.json(); } } async function getData() { let serv = new MyHelper(); const [bookResult, appleResult] = await Promise.allSettled([ serv.getBook(1), serv.getApple(2) ]); if (bookResult.status === "rejected") { console.log('Ошибка получения книги: ' + bookResult.reason); } } |
Цитата:
Там даже throw не срабатывает. Все в массиве <script> (async function () { let a try { a = await Promise.allSettled([ Promise.resolve(1), Promise.reject(-2), Promise.resolve(3), Promise.reject(-4).catch(er => {throw er*2}), ]) } catch (er) { console.log (er) } console.log (a) })() </script> Вернее throw срабатывает, но catch его не ловит. |
Часовой пояс GMT +3, время: 22:48. |