为什么在调用mongoose Model.create时不能链式使用.catch?

9
我有一个mongoose模式并调用Model.create()。
当我在'then'后面链接'catch'时,如果我只是将错误函数作为'then'的第二个参数调用,则会得到undefined不是函数的错误,但如果我直接调用错误函数,则不会出现该错误。
但是当我调用Model.find等方法时,我可以使用'catch'。
为什么我不能在调用Model.create时链接'catch'?
var mySchema = Mongoose.Schema({
     name: String,
});

职能:

KarmaModel.create({
            "name": "ss,
        })
        .then(function() {
            //do somthing
        },function()=>{
            //do somthing
        });

不起作用:

KarmaModel.create({
            "name": "ss,
        })
        .then(function() {
            //do somthing
        }).catch(function()=>{
            //do somthing
        });

因为它们的承诺必须不符合A+规范。也就是说,假设.catch在规范中。mongoose promise的README说它符合规范... - Chev
无论如何,源代码 明显没有 .catch :/ - Chev
3个回答

12

http://mongoosejs.com/docs/promises.html 上所指定的:

Mongoose 4.1.0 中的新功能。尽管 mpromise 对于基本用例已经足够,但高级用户可能想要插入他们最喜欢的 ES6 风格的 promise 库,例如 bluebird, 或者只使用原生的 ES6 promises。只需将 mongoose.Promise 设置为您喜欢的 ES6 风格的 promise 构造函数,mongoose 就会使用它。

您可以使用以下代码设置 mongoose 使用 bluebird:

require("mongoose").Promise = require("bluebird");

9
经过仔细研究,看起来.catch并不是Promises/A+规范的一部分。大多数库似乎只是将其实现为语法糖。 MPromise库是Mongoose的Promise库,它似乎符合规范的基本要求。你可以尝试使用另一个Promise库来包装Mongoose Promise,但最好的方法可能是使用标准的.then(success, error)处理程序。
如果想要包装它们,可以这样做:
var Promise = require('bluebird');
Promise.resolve(KarmaModel.create({ "name": "ss" })
  .then(function() {
    // do something
  })
  .catch(function() {
    // do something
  });

蓝鸟是我最喜欢的实现,但几乎任何流行的promise库都具备此功能。


9

在某个时候,mpromise 似乎已经添加了对 .catch() 的支持。我正在使用 mongoose@4.5.1,并且 .catch() 正常工作,符合预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接