我尝试在mongodb的集合中添加项目。
解决每个承诺的最佳方法是什么?
putAlldata: function(items) {
return new Promise(function(resolve, reject) {
MongoClient.connect(config.dbDelinquency.url, function(err, db) {
if (err) {
reject(err);
} else {
resolve(db);
}
})
}).then(function(db) {
return new Promise(function(resolve, reject) {
var collection = db.collection('data');
items.forEach(function(item) {
//console.log(item);
db.collection('data').insert(item)
})
resolve(items.length);
});
});
}
答案 0 :(得分:1)
使用Promise.all和Array.map。我认为db.collection.insert
会返回一个承诺。如果没有,请告诉我。
.then(function(db) {
return Promise.all(items.map(function(item) {
return db.collection('data').insert(item)
}))
.then(() => items.length);
});
});
答案 1 :(得分:0)
您可以使用http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#insertMany(insertMany),而不是对项目数组中的每个项目执行.insert
。
当省略回调时,MongoDB驱动程序还会为大多数方法返回promise,因此您不需要自己处理promisifying。
您可以将所有示例代码重写为:
return MongoClient.connect(url).then(db => db.collection('data').insertMany(items));
如果您真的想要迭代并单独执行.insert
,您可以创建一个承诺数组并使用Promise.all
等待:
return Promise.all(items.map(item => db.collection('data').insert(item)));
答案 2 :(得分:0)
您可以使用.insert
或.insertMany
进行批量插入。
return new Promise((resolve, reject) => {
const collection = db.collection('data');
try {
const results = db.collection.insertMany(items);
return resolve(results);
} catch (error) {
return reject(error);
}
}
作为旁注......每次打电话时创建数据库连接都是不好的做法。
答案 3 :(得分:0)
您将.map
与Promise.all
结合使用,因此类似于:
var promises = items.map(item => {
return db.collection('data').insert(item)
});
Promise.all(promises).then(...etc
在.then
的{{1}}中,您可以解决自己的承诺。