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