J'essaie de pousser dans une boucle dans une fonction asynchrone, mais les données entrées dans ce tableau ne sont pas enregistrées après la fin de la boucle. Que ferais-je de mal?


    for (cont = 0; cont < 3; cont += 1) {
      console.log(cont);

      sqs.receiveMessage(paramsReceiveMessage, (err, data) => {
        if (err) {
          console.log('Receive Error', err);
        } else if (data.Messages) {
          const [{ MD5OfBody }] = data.Messages;
          sqsMessages.push(MD5OfBody);

          console.log(sqsMessages);
        }
      });
    }

    const result = await Promise.all(sqsMessages);

    console.log(result);

    return result;

Ma réponse:

2019-11-04T14:35:12.219Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    0
2019-11-04T14:35:12.221Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    1
2019-11-04T14:35:12.223Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    2
2019-11-04T14:35:12.224Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    []
0
Sergio RBJ 4 nov. 2019 à 17:43

2 réponses

Meilleure réponse

Votre fonction de rappel dans sqs.receiveMessage() est toujours active lorsque le code atteint plus tard le await Promise.all(), donc votre tableau sqlMessages - est toujours vide. Vous devez attendre que les promesses de ce tableau soient terminées.

En d'autres termes, créez un tableau avec des promesses et attendez-les. Quelque chose comme ça:

const promises = [];

for (cont = 0; cont < 3; cont += 1) {
    console.log(cont);

    promises.push(new Promise((resolve, reject) => {

        sqs.receiveMessage(paramsReceiveMessage, (err, data) => {
            if (err) {
                console.log('Receive Error', err);
                reject(err);
            } else if (data.Messages) {
                const [{ MD5OfBody }] = data.Messages;
                sqsMessages.push(MD5OfBody);
                console.log(sqsMessages);
                resolve(MD5OfBody);
            }
        });
    }));
}

const result = await Promise.all(promises);

console.log(result);
1
Martin Wickman 5 nov. 2019 à 07:24

En regardant votre code, je m'attendrais à ce que l'avant-dernière instruction (console.log (result);) s'exécute avant toute autre chose - et cela signifie que le résultat consolidé sera vide.

Si le reste du code est correct (ce que je ne peux pas vraiment dire), vous devriez pouvoir console.log le résultat (dernière ligne de code affichée) à l'endroit où le retour revient.

pseudocode:

containing function(){
    console.log(yourCodeInFunction());
}

Cette console devrait donner un résultat, car elle ne fonctionnera pas tant que vos messages ne seront pas reçus.

0
Katinka Hesselink 4 nov. 2019 à 14:51