gpt4 book ai didi

javascript - nodejs 等到循环中的所有 MongoDB 调用完成

转载 作者:IT老高 更新时间:2023-10-28 13:35:24 25 4
gpt4 key购买 nike

我正在逐行读取 CSV 文件中的数据流,并在每一行上调用 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') 只会在数据流结束时调用,而不是在 Monogo 调用之后。

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

最佳答案

您可以使用 Q API 女巫允许你做出 promise 。有一个有趣的函数可以让你等待一系列 Promise 被解决。以下是如何使用 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);

关于javascript - nodejs 等到循环中的所有 MongoDB 调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com