# 承諾(promises)
> 原文:[Built-in Promises](http://mongoosejs.com/docs/promises.html)
## Built-in Promises
Mongoose異步操作,像`.save()`和查詢,返回[Promises/A+ conformant promises](https://promisesaplus.com/)。這意味著你可以像`MyModel.findOne({}).then()`和 `MyModel.findOne({}).exec()`(如果你使用[co](https://www.npmjs.com/package/co)包)。
為了向后兼容,Mongoose 4返回默認mpromise承諾。
```
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查詢不是承諾。然而,他們也有一個`.then()`功能為產量和異步/等待。如果你需要一個完全成熟的承諾,用`.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
});
```
### Plugging in your own Promises Library
> Mongoose 4.1.0 新特性
而mpromise滿足基本使用的情況下,高級用戶可能想插上自己喜歡的[ES6風格](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)[承諾類庫](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)像[bluebird](https://www.npmjs.com/package/bluebird),或只使用本地的ES6承諾。只需要設置`mongoose.Promise`到你喜歡的ES6風格承諾構造函數,mongoose會使用它。
隨著本土承諾ES6Mongoose試驗,[bluebird](https://www.npmjs.com/package/bluebird)和[q](https://www.npmjs.com/package/q)。任何承諾類庫,理論上導出一個ES6風格的構造函數應該工作,但理論往往不同于實踐。如果你發現一個bug,開放式問題在[GitHub](https://github.com/Automattic/mongoose/issues)上。
```
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);
```
### Promises for the MongoDB Driver
mongoose。承諾的屬性集的mongoose用承諾。然而,這并不影響底層的MongoDB的驅動程序;。如果你使用了底層的驅動程序,例如`Model.collection.db.insert()`,你需要做一些額外的工作來改變其所承諾的類庫。注意,下面的代碼假定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'));
});
```