[javascript] nodejs wartet, bis alle MongoDB-Aufrufe beendet sind



0 Answers

Verwenden Sie Pause / Fortsetzen

  .on('data', function (data) {
    if (data.size === 'a3') {
      this.pause(); // pause it
      var stream = this; // save 'this'
      ProductModel.findOne({ sku: data.sku }, function (err, product) {
        if (product !== null) {
          product.size = data.size;
          product.save();
          validProducts.push(product);
        }
        stream.resume(); //resume it
      });
    }
  });
Question

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