当我在 mongodb 集合中添加项目时,如何管理每个承诺



我尝试在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);
  });
});

}

使用 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);
  });
});

您可以使用 http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#insertMany (insertMany),而不是对项目数组中的每个单独项目执行.insert

当省略回调时,MongoDB 驱动程序还会返回大多数方法的承诺,因此您无需自己处理承诺。

您可以将所有示例代码重写为:

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)));
您可以使用

.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);
  }
}

作为旁注....每次要进行调用时创建数据库连接都是不好的做法。

您将.mapPromise.all结合使用,因此它将如下所示:

var promises = items.map(item => {
  return db.collection('data').insert(item)
});
Promise.all(promises).then(...etc

Promise.all .then,你可以解决自己的承诺。

最新更新