Вот подробное объяснение
- циклы синхронны.
- Обещания асинхронны.
Чтобы получить данные из обещаний, вам нужно подождать для его завершения sh с использованием функции обратного вызова, asyn c -wait или обещания.
В вашем коде вы помещаете .then
для доступа к результату wixData, но все wixData.get("Card", cardToGet).then(async (card) => {})
является асинхронным c функция для loopCards(cardsToGet)
, и из-за этого ваш l oop завершается, а массив результатов пуст.
Решение - Просто подождите wixData.get("Card", cardToGet)
до конца sh и затем выполните манипуляции. Вот решение с использованием asyn c await.
async function loopCards(cardsToGet) {
let cardsToInsert = [];
for (let index = 0; index < cardsToGet.length; index++) {
const cardToGet = cardsToGet[index].card
let card = await wixData.get("Card", cardToGet)
let writeCard = await buildingCard(card)
cardsToInsert.push(writeCard)
}
return cardsToInsert
}
. В приведенном выше коде я жду, пока wixData.get("Card", cardToGet)
завершит sh, и сохраню результат в get card. Это должно решить вашу проблему.
, но этот код по производительности не является оптимальным, так как вы ожидаете каждого сетевого вызова. то, что вы можете сделать, это выполнить все Обещания одновременно, используя Promise.all
Вот код для этого с обработкой ошибок -
async function loopCards(cardsToGet){
try {
return await Promise.all( cardsToGet.map( cardToGet => buildCard( cardToGet.card )));
}
catch (error) {
console.log(error);
}
}
async function buildCard(cardToGet){
try {
let card = await wixData.get("Card", cardToGet);
let writeCard = await buildingCard(card);
return writeCard;
}
catch (error) {
console.log("getcard error: " + error);
return error;
}
}
В приведенном выше коде могут быть некоторые ошибки, поскольку я не проверял его, но я надеюсь, что вы получите подход.