Javascript.RU

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

Можно ли здесь использовать then?
Здравствуйте!

Делаю тестовое задание, в котором надо выводить товары, возвращаемые с рандомной удачей локальным сервером (в папке server). В импортируемой модели(файл APImodel.js в папке client) создал метод getGoodsList:
function getGoodsList(step = 0) {
  fetch(`http://localhost:3000/api/products?status=200`)
    .then(res => {
      if (res.status === 404) {
        return {}
      }
      if (res.status === 500) {
        if (step < 2) {
          getGoodsList(step++);
        }
        else {
          createMessage('Произошла ошибка, попробуйте обновить страницу позже');
        }
      }
      return res.json();
    })
    .then (json => {
      if (!(!json.products || json.products.length === 0)) return json;
    })
    .catch(error => {
      console.log(`Error name is: ${error.name}, error message is: ${error.message}`);
    });
}

который в файле view.js вызываю таким образом:
async function createApp(container, model) {
    //showSpiner();
    model.getGoodsList()
    .then(goodsData => {
      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);
        }
      }
    });
}


Можно ли здесь использовать .then? Или это только для promise объектов, и мой метод getGoodsList возвращает не promise?
Вложения:
Тип файла: zip дз.zip (4.0 Кб, 0 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 05.03.2024, 21:40
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Сообщение от borus
Можно ли здесь использовать .then?
Нет, нельзя. Ваша функция `getGoodsList`, возвращает undefined, а у undefined нет метода then.

Сообщение от borus
возвращаемые с рандомной удачей локальным сервером
Что значит "с рандомной удачей"? Когда-то вернет, когда-то закрашится?


Код, конечно, "мое почтение". Хотел про логику обработки ответа от сервера написать, а потом дальше посмотрел и понял, что смысла особого нет, у вас все плохо.
Ответить с цитированием
  #3 (permalink)  
Старый 05.03.2024, 21:47
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Спасибо. А почему она возвращает undefined?
Да, создателями сервера запрограммирован случайный ответ
Ответить с цитированием
  #4 (permalink)  
Старый 05.03.2024, 22:16
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

Сообщение от Alexandroppolus Посмотреть сообщение
ты забыл return
Так в первом посте видно, что в 18 строке определения функции getGoodsList() есть return json; в последнем then(). Не катит?
Ответить с цитированием
  #6 (permalink)  
Старый 06.03.2024, 14:09
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

borus, а почему вы считаете, что функция getGoodsList должна вернуть вам результат строки 18, а не 15 например?

Строки 15 и 18 возвращают результат работы именно тех стрелочных функций, в которых они написаны. Сама же функция getGoodsList у вас не имеет ключевого слова return и, соответственно, не возвращает ничего или, можно сказать, возвращает undefined.
Строка 18 возвращает данные, которые будут храниться в промисе (Promise), который возвращает функция fetch.

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

Сообщение от Nexus
borus, а почему вы считаете, что функция getGoodsList должна вернуть вам результат строки 18, а не 15 например?
потому что возвращаться должен результат последнего then, насколько понимаю.
Получается функцию getGoodsList() правильнее написать так:
function getGoodsList(step = 0) {
  return fetch(`http://localhost:3000/api/products?status=200`)
    .then(res => {
      if (res.status === 404) {
        return {}
      }
      if (res.status === 500) {
        if (step < 2) {
          getGoodsList(step++);
        }
        else {
          createMessage('Произошла ошибка, попробуйте обновить страницу позже');
        }
      }
      return res.json();
    })
    .then (json => {
      if (!(!json.products || json.products.length === 0)) return json;
    })
    .catch(error => {
      console.log(`Error name is: ${error.name}, error message is: ${error.message}`);
    });
}

?
Ответить с цитированием
  #8 (permalink)  
Старый 06.03.2024, 17:11
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Сообщение от borus
Получается функцию getGoodsList() правильнее написать так:
Да, в таком случае ваша функция будет возвращать промис, который будет содержать полученные от сервера данные или undefined.

И, btw, у вас в файле view.js в 5й строчке будет ошибка:
if (goodsData !== null && goodsData.products.length > 0){

У вас в переменной `goodsData` может быть как объект, так и undefined, о чем выше уже писал. Вы же проверяете является ли goodsData строго null'ом или нет (всегда будет true, поскольку {} !== null и undefined !== null).
Если `goodsData` содержит undefined, то проверка на не null пройдет успешно, а дальше вы попытаетесь прочитать свойство `products` у undefined, что закономерно вызовет ошибку: «cannot read property 'products' on undefined»

А в 9й строчке кода сообщения #7 запрос к серверу будут осуществлен "в холостую", т.к. результаты этого запроса просто игнорируются.

Последний раз редактировалось Nexus, 06.03.2024 в 17:13.
Ответить с цитированием
  #9 (permalink)  
Старый 07.03.2024, 18:34
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Сообщение от Nexus
А в 9й строчке кода сообщения #7 запрос к серверу будут осуществлен "в холостую", т.к. результаты этого запроса просто игнорируются.
Здравствуйте! Спасибо.
Как это игнорируются? Если в результатах res.status === 500, то только тогда делается повторная попытка запроса данных с сервера.
Ответить с цитированием
  #10 (permalink)  
Старый 07.03.2024, 19:10
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Но повторная попытка ничего не возвращает.
getGoodsList должен вернуть промис.
При вызове второй раз ничего не возвращается. Что тогда должен вернуть первый getGoodsList?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какую можно применить сортировку комбинаций из 2х значений alex-romanov Общие вопросы Javascript 19 27.06.2019 11:10
Angular 6 elements (@angular/elements) - когда можно будет использовать? yinfo Angular.js 1 06.04.2018 11:51
Можно ли разместить здесь скрипт? - вопрос от JavaLokha Эдди Элементы интерфейса 0 19.12.2012 16:06
стоит ли использовать Perl mycoding Серверные языки и технологии 9 12.10.2010 15:33
когда можно использовать for(var k in arr) scuter Общие вопросы Javascript 17 29.08.2008 15:34