Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 11.03.2024, 22:07
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

https://learn.javascript.ru/promise-chaining
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2024, 11:07
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

ты опять забыл 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();
    });
}
Ответить с цитированием
  #4 (permalink)  
Старый 15.03.2024, 15:34
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Сообщение от Alexandroppolus
ты опять забыл return
Спасибо. Помогло. Почитал я предложенную статью, всё равно не понял, почему так происходило. Одного return перед fetch внутри getGoodsList() почему не хватало?
Ответить с цитированием
  #5 (permalink)  
Старый 15.03.2024, 16:32
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от borus
Одного return перед fetch внутри getGoodsList() почему не хватало?
Так это не тот return.
Ответить с цитированием
  #6 (permalink)  
Старый 15.03.2024, 16:44
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

return fetch(...)

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

А не, нужный тебе, результат...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему результат такого же запроса пустой? Wynell AJAX и COMET 2 23.05.2020 13:00
Почему возвращает значения RGB каналов? Black_Star jQuery 14 06.02.2017 04:49
код ответа сервера 204 вместо 200 leol Общие вопросы Javascript 2 20.02.2014 17:19