Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2020, 12:53
BBJ BBJ вне форума
Новичок на форуме
Отправить личное сообщение для BBJ Посмотреть профиль Найти все сообщения от BBJ
 
Регистрация: 07.12.2020
Сообщений: 4

Ппромисы, 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) {
      
    }
}


Надеюсь не путанно получилось объяснить) Спасибо.

Последний раз редактировалось BBJ, 07.12.2020 в 16:18.
Ответить с цитированием
  #2 (permalink)  
Старый 07.12.2020, 15:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от BBJ
И теперь вызов createData, но тут мне приходит Промис, а это значит снова await или then-catch?
Ну да
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) {
       
    }
}
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2020, 15:32
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от BBJ
Можно или один метод запрашивать или в Promise.all сразу несколько, что по задумке удобно. А как возвращать значения и отлавливать ошибки?
Смотря, что вам нужно
let arv =await Promise.all (
[
getBook(id),
getApple(id)
])
// когда все промисы исполнятся а arv будет массив значений
//Или значение первого отклоненного

Есть еще функция allSettled https://developer.mozilla.org/ru/doc...ise/allSettled, она всегда возвращает массив из значений или причин отконений.
Смотрите, что удобнее.
Ответить с цитированием
  #4 (permalink)  
Старый 08.12.2020, 09:17
BBJ BBJ вне форума
Новичок на форуме
Отправить личное сообщение для BBJ Посмотреть профиль Найти все сообщения от BBJ
 
Регистрация: 07.12.2020
Сообщений: 4

Спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 11.12.2020, 09:25
BBJ BBJ вне форума
Новичок на форуме
Отправить личное сообщение для BBJ Посмотреть профиль Найти все сообщения от BBJ
 
Регистрация: 07.12.2020
Сообщений: 4

А правильно, что для 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);
  }
}
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2020, 10:01
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от BBJ
А правильно, что для allSettled не нужен try-catch? Все ошибки у нас будут в переменных массива результатов?
И действительно!
Там даже 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 его не ловит.

Последний раз редактировалось voraa, 11.12.2020 в 10:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возврат значения в ajax hoax AJAX и COMET 37 11.04.2015 07:14
Возврат принятого значения внешней функции из jquery ajax pro_xaoc jQuery 2 20.06.2014 12:20
Возврат значения функции после завершения анимации (затухания) grego jQuery 5 16.04.2013 22:25
Возврат значения Rompo Общие вопросы Javascript 6 27.04.2012 12:32
возврат увеличенного значения AJAX mikeles AJAX и COMET 0 31.10.2009 08:48