Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему вместо повторного запроса значения с сервера следует переход в then()? (https://javascript.ru/forum/misc/85789-pochemu-vmesto-povtornogo-zaprosa-znacheniya-s-servera-sleduet-perekhod-v-then.html)

borus 11.03.2024 21:40

Почему вместо повторного запроса значения с сервера следует переход в then()?
 
Вложений: 1
Продолжаю делать учебный проект, который запрашивает данные по товарам с некого локального сервера(код сервер не буду прикладывать) с помощью функции 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()?

Nexus 11.03.2024 22:07

https://learn.javascript.ru/promise-chaining

Alexandroppolus 12.03.2024 11:07

ты опять забыл return

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) {
          return getGoodsList(++step);
        }
        else {
          throw new Error ('500');
        }
      }
      return res.json();
    });
}

borus 15.03.2024 15:34

Цитата:

Сообщение от Alexandroppolus
ты опять забыл return

Спасибо. Помогло. Почитал я предложенную статью, всё равно не понял, почему так происходило. Одного return перед fetch внутри getGoodsList() почему не хватало?

ksa 15.03.2024 16:32

Цитата:

Сообщение от borus
Одного return перед fetch внутри getGoodsList() почему не хватало?

Так это не тот return. :)

ksa 15.03.2024 16:44

return fetch(...)

Вернет промис, который должен разрешиться впоследствии...
Там "внутри" у тебя есть getGoodsList() - вот промис должен разрешиться его значением. А у тебя есть просто вызов.
Ты его вызвал, а вернул таки
return res.json()

А не, нужный тебе, результат...


Часовой пояс GMT +3, время: 06:26.