sql >> Base de Datos >  >> NoSQL >> MongoDB

Empuje dentro de forEach con la consulta que no funciona correctamente

Es un problema asincrónico. Está poblando el valor de la matriz dentro de una devolución de llamada. Pero debido a la naturaleza del ciclo de eventos, es imposible que alguna de las devoluciones de llamada haya sido llamada en el momento en que console.log se ejecuta.

Mencionaste una solución que involucra promesas, y esa es probablemente la táctica correcta. Por ejemplo, algo como lo siguiente:

exports = function(orgLoc_id, data) {
  // ...
  let stream_ids = [];
  const promises = data.map(function(stream) {
    return streamsCollection.findOne({ _id: stream.stream_id }, { type: 1, sizes: 1 })
      .then(res => { //if I comment this query it will push without any problem
        if (res) {
          let newId = new BSON.ObjectId();
          // ...
          stream_ids.push(newId);
        }
      })
  })

  Promise.all(promises).then(function() {
    console.log('stream ids: ' + stream_ids);

    //TODO
    // any code that needs access to stream_ids should be in here...
  });
};

Tenga en cuenta el cambio de forEach a map ... de esa manera obtienes una matriz de todas las Promesas (supongo que tu findOne está devolviendo una promesa debido a .then ).

Luego usas un Promise.all esperar a que se resuelvan todas las promesas, y luego debería tener su matriz.

Nota al margen:una solución más elegante implicaría devolver newId dentro de su .then . En ese caso Promise.all en realidad se resolverá con una matriz de los resultados de todas las promesas, que serían los valores de newId .