2016-08-26 113 views
6

当前使用节点4.3.2和mongo 2.6。我试图获得一个完整的集合(目前在集合中的三个文档)。当我使用这段代码时,我遇到了一个问题。cursor.toArray()返回承诺而不是数组

function checkUpdateTime(last_updated){ 
    var collection = db.collection(last_updated); 
    collection.insert({a:1}); 
    updateTimes = collection.find({a:1}).toArray(); 
} 
var updateTimes = []; 
checkUpdateTime('last_updated'); 
console.log(updateTimes); 

当这段代码是tun updateTimes是一个承诺,而不是我希望的数组。我们的目标是编辑数组,然后再将其插入到集合中。插入语句有效,但文档的检索根本无法按我期望的方式操作。我已经尝试了很多版本的代码,但没有骰子。

我想它归结为我想知道为什么一个承诺被退回?

回答

9

MongoDB的驱动程序提供了两个选项来处理异步操作:通过返回一个承诺给调用者

通过获得由主叫方

  • 通过回调

    • ,当你不通过回调,就像你的情况一样,它会返回一个承诺。

      所以你需要在这里做出选择。不过,您不能选择的一种选择是“使此代码同步运行”

      我喜欢承诺:

      function checkUpdateTime(last_updated){ 
          var collection = db.collection(last_updated); 
          return collection.insert({ a : 1 }) // also async 
              .then(function() { 
              return collection.find({ a : 1 }).toArray(); 
              }); 
      } 
      checkUpdateTime('last_updated').then(function(updateTimes) { 
          console.log(updateTimes); 
      }); 
      

      你总是可以走得更花哨一点,并使用类似Promise.coroutine,这将使你的代码看起来有点更同步(即使它是不是):

      const Promise  = require('bluebird'); 
      const MongoClient = require('mongodb').MongoClient; 
      
      let checkUpdateTime = Promise.coroutine(function* (db, last_updated){ 
          let collection = db.collection(last_updated); 
          yield collection.insert({ a : 1 }); 
          return yield collection.find({ a : 1 }).toArray(); 
      }); 
      
      Promise.coroutine(function *() { 
          let db = yield MongoClient.connect('mongodb://localhost/test'); 
          let updateTimes = yield checkUpdateTime(db, 'foobar'); 
          console.log(updateTimes); 
      })(); 
      

      或者async/await,使用Babel

      const MongoClient = require('mongodb').MongoClient; 
      
      async function checkUpdateTime(db, last_updated) { 
          let collection = db.collection(last_updated); 
          await collection.insert({ a : 1 }); 
          return await collection.find({ a : 1 }).toArray(); 
      } 
      
      (async function() { 
          let db = await MongoClient.connect('mongodb://localhost/test'); 
          let updateTimes = await checkUpdateTime(db, 'foobar'); 
          console.log(updateTimes); 
      })(); 
      
  • +0

    '“你不能选择“'。他可以。用'async/await'。 –

    +0

    @vp_arth仍然,这不会使它同步(线索是在名称,“异步”;-)。不过,它可能会像它一样,这就是为什么我将它添加为例:D – robertklep