我需要在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);
我的问题是异步,发现是一起完成的,所以他们找不到任何东西,因为插入在找到之前一起执行。
如何在不失去异步操作优势的情况下解决此问题?
答案 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()就是你想要的。
"系列"异步库中的类型都等待当前操作或"迭代"在这种情况下完成,因为回调随后用于在另一个开始之前发出结束信号。
当然,这些循环使用事件而不会阻塞。