nodejs等待,直到所有的MongoDB调用循环完成

我正在逐行读取一个CSV文件的数据stream,并在每一行调用一个findOne MongoDB调用,在运行下一个函数之前,我怎么才能等到每行的所有mongo调用都完成?

我见过Promises能做到吗? 但是我发现Promises非常难以理解。 而且我发现的例子都没有包括我想要的。 :/

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')on('end')只会在数据stream的末尾调用,而不是在Monogo调用之后调用。

如果我可以使用承诺,有人可以解释一下吗?

       

网上收集的解决方案 "nodejs等待,直到所有的MongoDB调用循环完成"

你可以使用Q API巫婆允许你作出承诺。 有一个有趣的function,可以让你等待一系列的承诺解决。 以下是一个如何解决Q.all问题的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); 

使用暂停 / 恢复

  .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 }); } });