2017-05-24 57 views
0

我目前正在使用Mongoose和Bluebird作爲Promise庫中的插件。 繼貓鼬的文檔,我也做了以下內容:Bluebird的Promise.map()在插入mongoose時不能與Mongoose配合使用.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() {}); 
} 

正如你所看到的,我試圖用青鳥的Promise.map()在我的代碼,但我不斷收到以下錯誤:

TypeError: Promise.map is not a function 

然後我試圖通過要求藍鳥並將其設置爲一個新的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() {}); 
} 

這個工作,但似乎並沒有是正確的方法來解決這個問題。我不知道這是否會導致與貓鼬代碼中的其他變量發生任何衝突。

任何建議,使其工作?

回答

1

要使用Promise.map(),您需要將Promise定義爲藍鳥的對象,而不僅僅是常規的ES6 Promise。你會是這樣做的:

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

或者,你甚至可能只是這樣做:

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

由於這是,你試圖做Promise.map()Promise普通ES6版本。


你的第二個做法是正確定義Promise是藍鳥的圖書館,這就是爲什麼Promise.map()工作,但你不使用藍鳥的承諾與貓鼬將在因爲不同類型,只要承諾之間的承諾互操作性的某些情況下工作因爲你只使用.then()對從貓鼬回來的承諾,沒有什麼特別的,就像無數的藍鳥額外的方法。

0

您獲得的錯誤是由定義mongoose.Promise而不是Promise,然後使用Promise,該變量不存在於該範圍內。

第二種方法似乎不會在mongoose之內修改任何內容。不過要確定如何定義promiseArray會很有趣。

然後,我不建議通過undefined作爲thencatch的處理程序。

+0

讓我編輯它以顯示我正在做的更準確的圖片。 –

+0

按照您的建議,將'mongoose.Promise'改爲'Promise',我就可以工作了。現在,我的問題是,這是否會將藍鳥應用於Mongoose的其他承諾?更好地說,這會覆蓋貓鼬的默認值嗎? –

+0

根據貓鼬的文件,貓鼬使用Promises/A +標準的承諾。這意味着他們應該能夠與藍鳥進行互操作,藍鳥也實施了Promises/A +標準。 繼第二種方法後,您不會以任何方式改變貓鼬。 現在,強烈建議如果你想和藍鳥一起旅行,你還是要做'mongoose.Promise = require('bluebird')'步驟。 – arboreal84