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
作为 then
和 catch
的处理程序传递。
为了使用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 附加方法。
我目前正在使用 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
作为 then
和 catch
的处理程序传递。
为了使用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 附加方法。