蓝鸟';s Promise.map()在插入Mongoose.Promise时不使用Mongoose

蓝鸟';s Promise.map()在插入Mongoose.Promise时不使用Mongoose,mongoose,bluebird,Mongoose,Bluebird,我目前正在与猫鼬和蓝鸟合作,作为一个插入式Promise库。 在以下mongoose文档中,我做了以下工作: var mongoose = require('mongoose'); mongoose.Promise = require('bluebird'); // Some function making use of Bluebird's Promise.map() function someFn() { return Promise.map([ someModel

我目前正在与猫鼬和蓝鸟合作,作为一个插入式Promise库。 在以下mongoose文档中,我做了以下工作:

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

// Some function making use of Bluebird's Promise.map()
function someFn() {
    return Promise.map([
        someModel.findById(someId).exec(),
        someOtherModel.findById(someOtherId).exec()
    ], mapperFn)
        .then(function() {})
        .catch(function() {});
}
如您所见,我试图在我的代码中使用bluebird的
Promise.map()
,但我一直遇到以下错误:

TypeError: Promise.map is not a function
然后我尝试要求bluebird并将其设置为一个新的
var Promise
,如下所示

var mongoose = require('mongoose');
var Promise = require('bluebird');

// Some function making use of Bluebird's Promise.map()
function someFn() {
    return Promise.map([
        someMode.findById(someId).exec(),
        someOtherModel.findById(someOtherId).exec()
    ], mapperFn)
        .then(function() {})
        .catch(function() {});
}
这是可行的,但似乎不是解决这个问题的正确方法。我不知道这是否会导致与mongoose代码中的其他变量发生冲突


有什么建议可以使这项工作正常进行吗?

您获得的错误是由于定义了
mongoose.Promise
而不是
Promise
,然后使用了
Promise
,这是一个在该范围内不存在的变量

第二种方法似乎并不是在
mongoose
中修改任何内容。然而,为了确保这一点,看看
promiseArray
是如何定义的将是一件有趣的事情


然后,我不建议将
未定义的
作为
然后
捕获
的处理程序传递。您获得的错误是由定义
mongoose.Promise而不是
Promise
引起的,然后使用
Promise
,这是一个在该范围内不存在的变量

第二种方法似乎并不是在
mongoose
中修改任何内容。然而,为了确保这一点,看看
promiseArray
是如何定义的将是一件有趣的事情


然后,我不建议将
undefined
作为
Then
catch
的处理程序传递。为了使用
Promise.map()
,您需要将
Promise
定义为Bluebird对象,而不仅仅是常规的ES6
Promise
。您可以这样做:

let Promise = require('bluebird');
mongoose.Promise = Promise;
或者,你甚至可以这样做:

let Promise = mongoose.Promise = require('bluebird');
实际上,您正试图使用常规ES6版本的
Promise
来实现
Promise.map()



第二种方法是正确地将
Promise
定义为Bluebird的库,这就是为什么
Promise.map()
有效的原因,但您没有将Bluebird的promises用于mongoose,这在某些情况下是有效的,因为不同类型的Promise之间存在互操作性,只要您只使用
关于猫鼬带来的承诺,没有什么比无数蓝鸟更特别的附加方法。

为了使用
Promise.map()
,您需要将
Promise
定义为蓝鸟的对象,而不仅仅是普通的ES6
Promise
。您可以这样做:

let Promise = require('bluebird');
mongoose.Promise = Promise;
或者,你甚至可以这样做:

let Promise = mongoose.Promise = require('bluebird');
实际上,您正试图使用常规ES6版本的
Promise
来实现
Promise.map()



第二种方法是正确地将
Promise
定义为Bluebird的库,这就是为什么
Promise.map()
有效的原因,但您没有将Bluebird的promises用于mongoose,这在某些情况下是有效的,因为不同类型的Promise之间存在互操作性,只要您只使用
关于猫鼬的承诺,没有什么特别的,比如无数的蓝鸟附加方法。

让我编辑它,以显示我正在做的事情的更准确的图片。按照你的建议,通过将
mongoose.Promise
更改为
Promise
,我成功了。现在,我的问题是,这是否会将蓝鸟应用到猫鼬的其他承诺中?更好的说法是,这会覆盖mongoose的默认mpromise吗?根据mongoose文档,mongoose使用承诺/A+合规承诺。这意味着他们应该能够与bluebird进行互操作,bluebird也可以实现Promises/A+标准。按照你的第二种方法,你不会以任何方式改变猫鼬。现在,强烈建议如果您想使用蓝鸟,您仍然可以执行
mongoose.Promise=require('bluebird')
步骤。让我对其进行编辑,以显示我正在做的事情的更准确的图片。按照您的建议,将
mongoose.Promise
更改为
Promise
,我已经成功了。现在,我的问题是,这是否会将蓝鸟应用到猫鼬的其他承诺中?更好的说法是,这会覆盖mongoose的默认mpromise吗?根据mongoose文档,mongoose使用承诺/A+合规承诺。这意味着他们应该能够与bluebird进行互操作,bluebird也可以实现Promises/A+标准。按照你的第二种方法,你不会以任何方式改变猫鼬。现在,强烈建议如果您想使用蓝鸟,您仍然可以执行
mongoose.Promise=require('bluebird')
步骤。有趣的是,它还可以使用
sequelize
let Promise=sequelize.Promise=require('bluebird')有趣,它还与
sequelize
一起工作:
让Promise=sequelize.Promise=require('bluebird')