我正在读取JSON对象并遍历每个项目。我首先要检查数据库中是否已经存在该项目,如果有,我想记录一条消息。如果尚不存在,我想添加它。
这可以正常工作,但是我想添加一个回调或使用process.exit()完成该过程;
因为猫鼬调用是异步的,所以我不能将其放在for循环的末尾,因为它们尚未完成。
我应如何处理此问题的最佳方法是什么?
function storeBeer(data) {
data.forEach((beer) => {
let beerModel = new Beer({
beer_id: beer.id,
name: beer.name,
image_url: beer.image_url
});
Beer.findOne({
'name': beer.name
}).then(function (result) {
if (result) {
console.log(`Duplicate ${result.name}`)
} else {
beerModel.save(function (err, result) {
console.log(`Saved: ${result.name}`)
});
}
});
});
}
有什么我应该读的书来帮助解决这个问题吗?
管理异步资源的一种方法是通过Promise
对象,这些对象是Javascript中的一流对象。这意味着它们可以组织成数组,并且可以像其他任何对象一样进行操作。因此,假设您想像问题所暗示的那样并行存储这些啤酒,则可以执行以下操作:
function storeBeer(data) {
// This creates an array of Promise objects, which can be
// executed in parallel.
const promises = data.map((beer) => {
let beerModel = new Beer({
beer_id: beer.id,
name: beer.name,
image_url: beer.image_url
});
return Beer.findOne({
'name': beer.name
}).then(function (result) {
if (result) {
console.log(`Duplicate ${result.name}`)
} else {
beerModel.save(function (err, result) {
console.log(`Saved: ${result.name}`)
});
}
});
);
});
return Promise.all(promises);
}
不要忘记该storeBeer
函数现在是异步的,将需要通过Promise
链或通过来使用async/await
。
例如,要随后添加进程出口:
async function main() {
const beers = [ ... ];
await storeBeer(beer);
process.exit(0);
}
您还可以修改上面的示例,以调用块中的storeBeer
函数try / catch
,并根据抛出的任何错误以不同的错误代码退出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句