Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему на странице с детальным описанием возвращается promise, а не описание эпизода? (https://javascript.ru/forum/misc/85730-pochemu-na-stranice-s-detalnym-opisaniem-vozvrashhaetsya-promise-ne-opisanie-ehpizoda.html)

borus 29.01.2024 14:53

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

Делаю учебный проект, который, используя общедоступный 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

ruslan_mart 29.01.2024 15:34

Потому что в 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);
    });
}

borus 29.01.2024 17:21

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

ruslan_mart 29.01.2024 17:46

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

async/await - это синтаксический сахар над промисами, поэтому возвращается промис.

roland 29.01.2024 18:10

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


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