Как вернуть массив в конце l oop (вопрос Newb ie) - PullRequest
1 голос
/ 01 мая 2020

Следующий код (который я упростил для ясности) перебирает и возвращает cardsToInsert до завершения каждой части l oop, поэтому массив не создается должным образом.

Циклы правильно строят массив, но результат возвращается в начале, а не после его построения.

Как мне получить его для завершения sh всех циклов перед возвратом массива?

async function loopCards(cardsToGet) {
  for (let cardToGet of cardsToGet) {
    getDataFunctionWhichReturnsAPromise()
       .then(async (card) => {
          writeCard = await buildingCard(card)
    cardsToInsert.push(writeCard)
  }
  return cardsToInsert
}

спасибо

Полный код добавлен как запрос

// wixData.get () возвращает обещание

async function loopCards(cardsToGet) {
    let writeCard
    let buildCard
        for (let index = 0; index < cardsToGet.length; index++) {
            const cardToGet = cardsToGet[index].card
            buildCard =  wixData.get("Card", cardToGet)
                .then(async (card) => {
                    writeCard = await buildingCard(card)
                    cardsToInsert.push(writeCard)
                    }
                )
                .catch((err) => {
                    let errorMsg = err;
                    console.log("getcard error: " + errorMsg);
                    return errorMsg
                }); 
        }
        return cardsToInsert
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Вот подробное объяснение

  1. циклы синхронны.
  2. Обещания асинхронны.

Чтобы получить данные из обещаний, вам нужно подождать для его завершения 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;
}

}

В приведенном выше коде могут быть некоторые ошибки, поскольку я не проверял его, но я надеюсь, что вы получите подход.

0 голосов
/ 01 мая 2020

вы должны обернуть l oop в обещание .then или также вы используете asyn c это означает, что будет напечатан самый первый элемент массива, а затем он будет ждать

getDataFunctionWhichReturnsAPromise()
       .then(async (card) => {
  for (let cardToGet of cardsToGet) {
          writeCard = await buildingCard(card)
    cardsToInsert.push(writeCard)}
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...