如何使异步等待下一个?

时间:2015-12-25 21:26:10

标签: javascript mongodb async-await

我有食物的阵列,每种食物都有一些措施。我必须将它们插入到两个数据库foodsmeasures中,但我必须检查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)
                }
            });
        });

1 个答案:

答案 0 :(得分:1)

行。

正在发生的事情是,多个指标发现数据库在第一个添加它之前没有任何度量,但是其他人也发现它不存在,他们也都添加了它。有两种方法可以解决这个问题:

  • 复制你对数据库的了解,不要两次查询同一件事

  • 实现一个在数据库端没有插入的函数

第二个更好,但通常有理由你不能这样做。

所以这是一个本地知识库的例子。在这个过程中,Promises和数据库的结果存储在“DB_contents”映射中,由他们查询的项目键入。

完成第一个查询后,所有后续查询都将排队。当第一个查询完成时,它会将其结果传播到任何等待的查询并存储它以供将来参考。

&