@kettel1
Frontend

Как получить результат выполнения промиса?

Есть следующий асинхронный код:

const checkGoodInCart = async (id) => {
    try {
        const response = await fetch(http://localhost:8000/cart);
        const data = await response.json();
        for (const item of data) {
            if(item.id === id) {
                return '<button>В корзине</button>'
            } else {
                return '<button>Добавить в корзину</button>'
            }
        }
    } catch (e) {
        console.log(e)
    }
};


Он должен использоваться при рендере карточки товара, т.е. в него передается id товара который рендрится на данный момент, и функция должна сверять, если ли такой id в бд, если есть, тогда должен возвращать html В корзине иначе Добавить в корзину, но если я просто вызываю функцию при рендере

использую литералы при рендере
<div class="product__button__wrapper">
                ${checkGoodInCart(item.id)}
            </div>


она возвращает промис, и вместо кнопки у меня написано [object Promise]

Подскажите как вернуть именно то, что указано в функции, т.е. строку с html

Я понимаю если мне нужен результат в консоль, то я пишу следующий код:

checkGoodInCart()
      .then(result => console.log(result))


Но нужно чтобы функция возвращала нужное значение строкой

Если это невозможно, хотя у меня есть такие подозрения что это невозможно, то каким путем мне можно пойти
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Тысячу раз уже на эту тему вопросы были...
Вам нужно понять суть асинхронности, промис на то он и промис, что это абстракция над значением в будущем, в момент вызова checkGoodInCart этого значения еще нет.
async/await это всего лишь сахар над промисами, await возвращает управление в event loop, "замораживая" функцию до того момента, пока промис переданный в await не скажет "значение готово, можешь забирать".

Единственный вариант здесь - сделать сам рендер асинхронным
<div class="product__button__wrapper">
                ${await checkGoodInCart(item.id)}
            </div>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект