我目前正在使用Mongoose和Bluebird作为插入的Promise库。 在mongoose docs之后,我做了以下几点:
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() {});
}
这有效,但似乎不是解决此问题的正确方法。我不知道这是否会导致与猫鼬代码中的其他变量发生冲突。
有任何建议使这项工作?
答案 0 :(得分:1)
要使用Promise.map()
,您需要将Promise
定义为Bluebird的对象,而不仅仅是常规的ES6 Promise
。你会这样做:
let Promise = require('bluebird');
mongoose.Promise = Promise;
或者,你甚至可以这样做:
let Promise = mongoose.Promise = require('bluebird');
实际上,您尝试使用Promise.map()
的常规ES6版本Promise
。
你的第二种方法是将Promise
正确定义为Bluebird的库,这就是Promise.map()
工作的原因,但你没有使用Bluebird的mongoose承诺,因为承诺不同类型之间的互操作性只要你只使用.then()
来承诺从猫鼬回来的承诺,并且没有什么特别的,就像无数的Bluebird其他方法一样。承诺。
答案 1 :(得分:0)
您获得的错误是由定义mongoose.Promise
而非Promise
,然后使用Promise
引起的,该变量在该范围内不存在。
第二种方法似乎并未修改mongoose
内的任何内容。然而,只是为了确定如何定义promiseArray
会很有趣。
然后,我不建议将undefined
作为then
和catch
的处理程序传递。