mongoose 文檔(十) Promises


Built-in Promises

Mongoose 異步操作,像 .save() 和 queries,返回 Promises/A+ conformant promises. 這就是說你可以做一些像MyModel.findOne({}).then() 和 yield MyModel.findOne({}).exec()(如果你在用co

 

為了向后兼容,mongoose 4默認返回mpromise promise。

  var gnr = new Band({
      name: "Guns N' Roses",
      members: ['Axl', 'Slash']
    });

    var promise = gnr.save();
    assert.ok(promise instanceof require('mpromise'));

    promise.then(function (doc) {
      assert.equal(doc.name, "Guns N' Roses");
    });

 

 

Queries are not promises

mongoose查詢不是promise。可是它有 yield 和 async/await 的 .then() 方法。如果你需要健全的promise,用.exec()方法。

  var query = Band.findOne({name: "Guns N' Roses"});
    assert.ok(!(query instanceof require('mpromise')));

    // A query is not a fully-fledged promise, but it does have a `.then()`.
    query.then(function (doc) {
      // use doc
    });

    // `.exec()` gives you a fully-fledged promise
    var promise = query.exec();
    assert.ok(promise instanceof require('mpromise'));

    promise.then(function (doc) {
      // use doc
    });
  

 

 

插入到你的 Promises 庫

在mongoose 4.1.0更新

在mpromise滿足基本使用的情況下,高級用戶可能想插入他們喜愛的ES6風格的Promise庫bluebird,或只是使用原生的ES6 promise。設置mongoose.Promise 給你喜歡的ES6風格的promise構造函數然后mongoose會使用它。

   var query = Band.findOne({name: "Guns N' Roses"});

    // Use native promises
    mongoose.Promise = global.Promise;
    assert.equal(query.exec().constructor, global.Promise);

    // Use bluebird
    mongoose.Promise = require('bluebird');
    assert.equal(query.exec().constructor, require('bluebird'));

    // Use q. Note that you **must** use `require('q').Promise`.
    mongoose.Promise = require('q').Promise;
    assert.ok(query.exec() instanceof require('q').makePromise);
  

 

 

MongoDB驅動的promise

mongoose.Promise屬性設置mongoose使用promise。可是,這影響底層MongoDB驅動。如果你使用底層驅動,例如Mondel.collection.db.insert(),你需要做點額外工作來改變底層promise庫。注意,下面的代碼假設mongoose >= 4.4.4。

    var uri = 'mongodb://localhost:27017/mongoose_test';
    // Use bluebird
    var options = { promiseLibrary: require('bluebird') };
    var db = mongoose.createConnection(uri, options);

    Band = db.model('band-promises', { name: String });

    db.on('open', function() {
      assert.equal(Band.collection.findOne().constructor, require('bluebird'));
    });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM