mongoose4.5中文教程
  • Introduction
  • Mongoose
  • guide
    • 模式(schemas)
      • 模式类型(types)
      • 自定义类型(custom)
    • 模型(models)
    • 文档(documents)
      • 子文档(sub docs)
      • 默认值(defaults)
    • 查询(queries)
    • 验证(validation)
    • 中间件(middleware)
    • 联表(population)
    • 连接(connections)
    • 插件(plugins)
    • 承诺(promises)
    • 鉴频器(discriminators)
    • 贡献
    • ES2015 整合
    • 浏览器中的schemas
    • 自定义schema类型
    • MongoDB版本兼容性
    • 3.6 发布说明
    • 3.8 发布说明
    • 4.0 发布说明
  • API 文档
Powered by GitBook
On this page
  • Built-in Promises
  • Queries are not promises
  • Plugging in your own Promises Library
  • Promises for the MongoDB Driver

Was this helpful?

  1. guide

承诺(promises)

Previous插件(plugins)Next鉴频器(discriminators)

Last updated 6 years ago

Was this helpful?

原文: 翻译:小虾米(QQ:509129)

Built-in Promises

Mongoose异步操作,像.save()和查询,返回。这意味着你可以像MyModel.findOne({}).then()和 MyModel.findOne({}).exec()(如果你使用包)。

为了向后兼容,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 新特性

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

而mpromise满足基本使用的情况下,高级用户可能想插上自己喜欢的像,或只使用本地的ES6承诺。只需要设置mongoose.Promise到你喜欢的ES6风格承诺构造函数,mongoose会使用它。

随着本土承诺ES6Mongoose试验,和。任何承诺类库,理论上导出一个ES6风格的构造函数应该工作,但理论往往不同于实践。如果你发现一个bug,开放式问题在上。

Built-in Promises
Promises/A+ conformant promises
co
ES6风格
承诺类库
bluebird
bluebird
q
GitHub