Estoy intentando insertar dentro de un bucle en una función asincrónica, pero los datos que se introducen en esta matriz no se guardan después de que finaliza el bucle. ¿Qué estaría haciendo 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;

Mi respuesta:

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 a las 17:43

2 respuestas

La mejor respuesta

La función de devolución de llamada en sqs.receiveMessage() sigue activa cuando el código llega más tarde al await Promise.all(), por lo que la matriz sqlMessages sigue vacía. Debe esperar a que se completen las promesas de esa matriz.

En otras palabras, cree una matriz con promesas y, a continuación, espere a que las hagan. Algo como esto:

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 a las 07:24

Al examinar el código, esperaría que la penúltima instrucción ( console.log(result); ) se ejecute antes que cualquier otra cosa, y eso significa que el resultado consolado estará vacío.

Si el resto del código es correcto (lo que no puedo decir del todo), debería poder console.log el resultado (última línea de código mostrada) en el lugar donde vuelve la devolución.

Pseudocódigo:

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

Esa consola debe dar un resultado, porque no se ejecutará hasta que se reciban los mensajes.

0
Katinka Hesselink 4 nov. 2019 a las 14:51