javascript findone - nodejs wartet, bis alle MongoDB-Aufrufe beendet sind




1 Answers

Sie können die Q- API verwenden, mit der Sie Versprechungen machen können. Es gibt eine interessante Funktion, mit der Sie auf eine Reihe von Versprechen warten können, die gelöst werden sollen. Hier ist ein Beispiel, wie Sie Ihr Problem mit Q.all lösen Q.all :

var validProducts = [];
var promises = [];

function handleData(data) {
    if (data.size === 'a3') {

        var deferred = Q.defer();

        ProductModel.findOne({ sku: data.sku }, function (err, product) {
            if (err) {
                deferred.reject(new Error(err));
            }

            if (product) {
                product.size = data.size;
                product.save();
                deferred.resolve(product);
                validProducts.push(product);
            }

        });

        promises.push(deferred.promise);

    }
}

function handleEnd() {
    Q.all(promises).done(function (values) {
        socket.emit({ 'status': 'complete' });
        otherFunction(validProducts);
    });
}

fs.createReadStream(req.file.path)
  .on('data', handleData)
  .on('end', handleEnd);
mongoose rest

Ich lese zeilenweise einen Datenstrom aus einer CSV-Datei und rufe in jeder Zeile einen findOne MongoDB-Aufruf auf. Wie kann ich warten, bis alle Mongo-Aufrufe aus jeder Zeile abgeschlossen sind, bevor ich die nächste Funktion ausführe?

Ich habe gesehen, dass Versprechungen das können? Aber ich finde Versprechen extrem schwierig zu verstehen. Und keines der Beispiele, die ich gefunden habe, scheint abzudecken, was ich versuche. : /

var validProducts = [];

fs.createReadStream(req.file.path)
  .pipe(csvStream)
  .on('error', function (err) {
    console.error(err);
  })
  // loop through all rows
  .on('data', function (data) {
    if (data.size === 'a3') {
      ProductModel.findOne({ sku: data.sku }, function (err, product) {
        if (product !== null) {
          product.size = data.size;
          product.save();
          validProducts.push(product);
        }
      });
    }
  });

// on finish make call to other function
socket.emit({ 'status': 'complete' });
otherFunction(validProducts);

on('finish') oder on('end') ruft nur am Ende des Datenstroms auf, nicht nach den Monogo-Aufrufen.

Wenn ich Versprechungen nutzen kann, kann mir bitte jemand erklären wie?




Related

javascript node.js mongodb asynchronous promise