Ппромисы, 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, время: 23:39. |