内部有多个插入的异步映射

时间:2014-06-30 08:52:53

标签: javascript node.js mongodb asynchronous

我需要在MongoDB中插入一个带有独特slug的主题列表。

这是两个主题的示例:

{
  title: "my title"
},
{
  title: "my title"
}

然后我需要生成slugs并插入我的主题:

// For each topic perform insert
async.map(topics, function (topic, done) {

    // Generate unique slug
    topic.slug = slug(topic.title).toLowerCase();

    // Look into DB to find topic with same slug
    self._collection.findOne({slug: topic.slug}, function(err, result) {

        // If there is a result then generate an unique slug prepending a shortId to the slug
        if (result) {
            topic.slug = shortId.generate() + "-" + topic.slug;
        }

        // Insert new topic into db
        self._collection.insert(topic, function (err, docs) {
            return done(err, docs[0]);
        });
    });

}, done);

我的问题是异步,发现是一起完成的,所以他们找不到任何东西,因为插入在找到之前一起执行。

如何在不失去异步操作优势的情况下解决此问题?

1 个答案:

答案 0 :(得分:1)

您真正需要做的就是将其更改为async.mapSeries

// For each topic perform insert
async.mapSeries(topics, function (topic, done) {

    // Generate unique slug
    topic.slug = slug(topic.title).toLowerCase();

    // Look into DB to find topic with same slug
    self._collection.findOne({slug: topic.slug}, function(err, result) {

        // If there is a result then generate an unique slug prepending a shortId to the slug
        if (result) {
            topic.slug = shortId.generate() + "-" + topic.slug;
        }

        // Insert new topic into db
        self._collection.insert(topic, function (err, docs) {
            return done(err, docs[0]);
        });
    });

}, done);

实际上,既然你并没有真正改变阵列,那么.eachSeries()就是你想要的。

"系列"异步库中的类型都等待当前操作或"迭代"在这种情况下完成,因为回调随后用于在另一个开始之前发出结束信号。

当然,这些循环使用事件而不会阻塞。