Bluebird 的 Promise.map() 在插入 mongoose.Promise 时无法与 Mongoose 一起工作

Bluebird's Promise.map() not working with Mongoose when plugged into mongoose.Promise

我目前正在使用 Mongoose 和 Bluebird 作为插入式 Promise 库。 按照猫鼬文档,我做了以下事情:

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 会很有趣。

然后,我不建议将 undefined 作为 thencatch 的处理程序传递。

为了使用Promise.map(),您需要将Promise定义为Bluebird的对象,而不仅仅是常规的ES6 Promise。你会这样做:

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

或者,您甚至可以这样做:

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

事实上,您正在尝试 Promise.map() 使用 Promise 的常规 ES6 版本。


您的第二种方法是将 Promise 正确定义为 Bluebird 的库,这就是 Promise.map() 起作用的原因,但是您没有将 Bluebird 的 promises 与 mongoose 一起使用,这在某些情况下会起作用,因为 promise 之间的互操作性不同类型的承诺,只要你只对从猫鼬返回的承诺使用 .then(),没有什么特别的,比如无数的 Bluebird 附加方法。