Javascript.RU

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

Почему на странице с детальным описанием возвращается promise, а не описание эпизода?
Здравствуйте!

Делаю учебный проект, который, используя общедоступный API, выводит списком и по отдельности описание эпизодов из Звездных войн. Столкнулся с тем, что на странице с детальным описанием эпизода, url которой на локальном компе выглядит как http://127.0.0.1:5500/index.html?episodeId=1, возвращается [object Promise], вместо по идее подготовленного в файле episode-details.js dom-элемента с описанием выбранного на главной странице эпизода киноэпопеи.
Кто-то может сказать почему возвращается promise вместо куска html? Приложил архив с проектом. Могу на сайт загрузить, если так будет понятнее смотреть код
P.S. API не быстрый, надо чуть подождать, когда запускаете index.html
Вложения:
Тип файла: zip 14_async-event-loop.zip (2.5 Кб, 2 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2024, 15:34
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Потому что в episode-details.js функция render определена как "анинхронная"

export async function render(data) {


То есть, вы ждете асинхронный "import", который возвращает "асинхронную функцию".

Добавьте функцию render также в цепочку промиса

function renderPage(moduleName, apiUrl, css){
  Promise.all([moduleName, apiUrl, css].map(src => loadResource(src)))
    .then(([pageModule, data]) => {
      return pageModule.render(data);
    })
    .then((result) => {
      appContainer.innerHTML = '';
      appContainer.append(result);
    });
}
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2024, 17:21
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

ruslan_mart, спасибо!
Это наверно я перемудрил, добавив async с await в экспортируемую функцию. Может надо было как-то по другому добывать html-описание эпизода в episode-details.js?

Последний раз редактировалось borus, 29.01.2024 в 17:41.
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2024, 17:46
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

borus, в целом, ничего плохого нет в текущем решении Иначе нормально и не получится сделать, если у вас асинхронные операции внутри render функции.

async/await - это синтаксический сахар над промисами, поэтому возвращается промис.
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2024, 18:10
Аспирант
Отправить личное сообщение для roland Посмотреть профиль Найти все сообщения от roland
 
Регистрация: 02.11.2023
Сообщений: 30

borus, можно поинтересоваться, какую роль выполняет cssPromis в коде main.js?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выпадающее меню на JS (подкатегории) Trueplayer Events/DOM/Window 5 18.09.2014 22:29
Древовидное меню и селекторы youstm jQuery 6 15.09.2014 12:42