Показать сообщение отдельно
  #1 (permalink)  
Старый 11.03.2024, 21:40
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Почему вместо повторного запроса значения с сервера следует переход в then()?
Продолжаю делать учебный проект, который запрашивает данные по товарам с некого локального сервера(код сервер не буду прикладывать) с помощью функции getGoodsList(), декларированной в файле APImodel.js.
Эта функция вызывается при построении приложения в функции createApp(), декларированной в файле view.js. выглядит это усеченно так:
async function createApp(container, model) {
    const spinner = document.getElementsByClassName('spinner-border')[0];
    spinner.style.display = ''; // покажем спиннер
    model.getGoodsList()
    .then(goodsData => {
      if (typeof goodsData !== 'undefined') {
        if (goodsData !== null && goodsData.products.length > 0){
          let goodsUL = createGoodsList();
          container.append(goodsUL);
          for (let item in goodsData.products) {
              let product = createLi(goodsData.products[item]);
              goodsUL.append(product);
          }
        }
      }
    })
...

А вот код getGoodsList() из APImodel.js:
//получение списка товаров:
function getGoodsList(step = 0) {
  return fetch(`http://localhost:3000/api/products`)
    .then(res => {
      if (res.status === 404) {
        throw new Error ('404');
      }
      if (res.status === 500) {
        if (step < 2) {
          getGoodsList(++step);
        }
        else {
          throw new Error ('500');
        }
      }
      return res.json();
    });
}

В этой функции получения данных происходит её рекурсивный самовызов(не более двух раз) в случае, если ответ сервера вернул статус 500.
В результате отладки увидел, что если статус ответа сервера равен 500, то после повторного вызова функции getGoodsList(), не дожидаясь нового ответа от сервера, ход исполнения программы перескакивает в секцию then() функции createApp().
Есть пара вопросов:
1. Почему такое происходит?
2. Как заставить код дождаться ответа после повторного обращения к серверу, прежде чем переходить в секцию then() функции createApp()?
Вложения:
Тип файла: zip client.zip (2.8 Кб, 0 просмотров)
Ответить с цитированием