2016-06-16 59 views
0

面對貓鼬的問題執行後承諾的NodeJS貓鼬無極然後/捕獲

MyModel.find().then((data)=> Promise.reject()) 
     .catch(()=>console.log('first catch')) 
     .then(()=>console.log('ok')) 
     .catch(()=>console.log('second catch')); 

我得到

first catch 
second catch 

但如果我只用本地公司承諾做到:

Promise.reject() 
     .catch(()=>console.log('first catch')) 
     .then(()=>console.log('ok')) 
     .catch(()=>console.log('second catch')); 

執行後我得到

first catch 
ok 

這是確定的承諾方面docs

看來,貓鼬使用自己的promise implementation

我發現我可以解決通過執行以下

new Promise((resolve, reject) => { MyModel.find().then((data) => reject()) }) 
     .catch(()=>console.log('first catch')) 
     .then(()=>console.log('ok') 
     .catch(()=>console.log('second catch')); 

它的工作原理,因爲它應該按照文檔:

first catch 
ok 

A呃建議如何更好地工作?

回答

1

貓鼬使用Promises/A +符合承諾。爲了向後兼容,默認情況下,Mongoose 4會返回mpromise承諾。

如果你想使用先進的承諾功能,你應該使用像藍鳥或本機ES6承諾的圖書館。要做到這一點剛剛成立mongoose.Promise您最喜愛的ES6風格的承諾構造和貓鼬將使用它:

require('mongoose').Promise = Promise; 
// or 
require('mongoose').Promise = require('bluebird'); 

Mongoose documentation

+0

謝謝,它會幫助我很多! – BotanMan

0

你也可以使用q庫的承諾。 「q」:「^ 1.4.1」 q是java腳本promises的最豐富的庫,所以我們可以使用多個promise。

var Q = require('q'); 
var promises= Q.all([ 
Model.find(), 
Model2.find(), 
Model3.find() 
]); 
promises.then(function(data){ 
//console.log(data[0]); 
//console.log(data[1]);`enter code here 
//console.log(data[2]); 
});`enter code here` 
promises.then(null,function(err){ 
});