我有食物的阵列,每种食物都有一些措施。我必须将它们插入到两个数据库foods
和measures
中,但我必须检查measures
数据库中是否存在现有度量。它是异步代码,我使用相同的name
获得多个度量。如何在检查数据库中是否存在度量之前让它等待?
return new Promise(function(resolve, reject) {
var foods = [];
async.each(result, function(obj, callback) {
var entity = mapper.fromNutritionApiToDatabase(obj);
var measures = mapper.mapMeasure(obj);
async.each(measures, function(item, callback) {
// console.log("Item : " + item.label);
var en = {
name: {
en: item.label,
bg: item.label
}
};
FoodMeasureRepository
.findOne({
"name.en": item.label
})
.then(function(result) {
// console.log("Result " + result);
if (result) {
entity.measures.push({
measureId: result._id,
value: parseInt(item.eqv)
});
callback();
} else {
FoodMeasureRepository
.insertOne(en)
.then(function(result) {
entity.measures.push({
measureId: result._id,
value: parseInt(item.eqv)
});
callback();
})
}
})
.catch(function(err) {
callback(err)
});
}, function(err) {
if (err) {
callback(err);
} else {
foods.push(entity);
callback();
}
});
}, function(err) {
if (err) {
console.log(err);
} else {
resolve(foods)
}
});
});
答案 0 :(得分:1)
行。
正在发生的事情是,多个指标发现数据库在第一个添加它之前没有任何度量,但是其他人也发现它不存在,他们也都添加了它。有两种方法可以解决这个问题:
复制你对数据库的了解,不要两次查询同一件事
实现一个在数据库端没有插入的函数
第二个更好,但通常有理由你不能这样做。
所以这是一个本地知识库的例子。在这个过程中,Promises和数据库的结果存储在“DB_contents”映射中,由他们查询的项目键入。
完成第一个查询后,所有后续查询都将排队。当第一个查询完成时,它会将其结果传播到任何等待的查询并存储它以供将来参考。
&