【问题标题】:NodeJs Mongoose Promise then/catchNodeJs Mongoose Promise then/catch
【发布时间】:2016-10-18 04:25:54
【问题描述】:

面对 Mongoose 承诺的问题

MyModel.find().then((data)=> Promise.reject())
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok'))
       .catch(()=>console.log('second catch'));

执行后我得到

first catch
second catch

但如果我只用原生 Promises 来做:

Promise.reject()
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok'))
       .catch(()=>console.log('second catch'));

执行后我得到

first catch
ok

就 Promise docs 而言没问题

好像Mongoose用的是自己的promise implementation

我发现我可以通过以下方式解决这个问题

new Promise((resolve, reject) => { MyModel.find().then((data) => reject()) })
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok')
       .catch(()=>console.log('second catch'));

根据文档,它可以正常工作:

first catch
ok

有什么建议可以更好地使用它吗?

【问题讨论】:

    标签: javascript node.js mongodb mongoose promise


    【解决方案1】:

    你也可以使用 q 库来实现承诺。 “q”:“^1.4.1” q 是 java 脚本 promises 中填充最多的库。所以我们可以同时使用多个 promises 结果。

    var Q = require('q');
    var promises= Q.all([
    Model.find(),
    Model2.find(),
    Model3.find()
    ]);
    promises.then(function(data){
    //console.log(data[0]);
    //console.log(data[1]);`enter code here
    //console.log(data[2]);
    });`enter code here`
    promises.then(null,function(err){
    });
    

    【讨论】:

      【解决方案2】:

      Mongoose 使用符合 Promises/A+ 的承诺。为了向后兼容,Mongoose 4 默认返回 mpromise 承诺。

      如果你想使用高级的 Promise 特性,你应该使用 bluebird 之类的库或原生 ES6 Promise。为此,只需将 mongoose.Promise 设置为您最喜欢的 ES6 风格的 Promise 构造函数,mongoose 就会使用它:

      require('mongoose').Promise = Promise;
      // or
      require('mongoose').Promise = require('bluebird');
      

      Mongoose documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 2019-01-12
        • 2020-01-02
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多