Можно ли здесь использовать then?
Вложений: 1
Здравствуйте!
Делаю тестовое задание, в котором надо выводить товары, возвращаемые с рандомной удачей локальным сервером (в папке 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? |
Цитата:
Цитата:
Код, конечно, "мое почтение". Хотел про логику обработки ответа от сервера написать, а потом дальше посмотрел и понял, что смысла особого нет, у вас все плохо. |
Спасибо. А почему она возвращает undefined?
Да, создателями сервера запрограммирован случайный ответ |
Цитата:
|
Цитата:
|
borus, а почему вы считаете, что функция getGoodsList должна вернуть вам результат строки 18, а не 15 например?
Строки 15 и 18 возвращают результат работы именно тех стрелочных функций, в которых они написаны. Сама же функция getGoodsList у вас не имеет ключевого слова return и, соответственно, не возвращает ничего или, можно сказать, возвращает undefined. Строка 18 возвращает данные, которые будут храниться в промисе (Promise), который возвращает функция fetch. |
Цитата:
Получается функцию 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}`); }); } ? |
Цитата:
И, 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 запрос к серверу будут осуществлен "в холостую", т.к. результаты этого запроса просто игнорируются. |
Цитата:
Как это игнорируются? Если в результатах res.status === 500, то только тогда делается повторная попытка запроса данных с сервера. |
Но повторная попытка ничего не возвращает.
getGoodsList должен вернуть промис. При вызове второй раз ничего не возвращается. Что тогда должен вернуть первый getGoodsList? |
Часовой пояс GMT +3, время: 02:20. |