在Mongoosepath中使用Promise

我理解JavaScript中的承诺或至less我认为我(如果我错了纠正我)。

创造一个承诺:

var promise = new Promise(function(resolve, reject){ // do something async here if(itWorked){ resolve(); }else { reject(); } }); 

使用承诺:

 promise.then(function(result){ },function(err){ }); 

我有一个基于MEAN Stack的应用程序,我的一些mongoose路线正在成为一个回拨地狱。 我想摆脱mongoose路线的callback,并使用承诺来处理它们。 但我似乎无法弄清楚究竟是怎么做到的。

例如:

 app.get('/users', function(req, res){ User.findOne(_id, function(err, user){ if(err) console.log(err) else if(user){ Receipt.findOne(user.bookName, function(err, book){ if(err) console.log(err) else if(book){ // again do something here } }) } }) }); 

在上面的例子中,你可以看到代码越来越难以阅读和维护。 我如何使用Promise来改善我的代码?

好的,首先你要用mongoose吗?

User是你的mongoose模型,对findOne(query)findOneAndUpdate(query, update, opts)等方法做出响应。

在调用这些方法之后,调用返回Query的方法exec()

查询不完全是一个承诺,你需要指定Mongo将使用哪些承诺。 在这里,我会build议使用本地的,所以,在你的项目中添加这一行:

  const mongoose = require('mongoose') mongoose.Promise = Promise 

现在,这条指令正在给你答复,很好!

 User.findOne(q).exec() 

你现在可以用你的逻辑创build一个Promise链,例如:

  return User .findOne(_id) .exec() .then((user) => { return Receipt .findOne({ bookName: user.bookName }) .exec() }) .then((receipt) => { // example return res.status(200).json(receipt) })) }) 

提示:我build议创build辅助方法,以使代码更加清洁:

 /** @return {Promise} */ function findUser(id) { return User.findOne(id).exec() } /** @return {Promise} */ function findReceipt(bookName) { return Receipt.findOne({ bookName }).exec() } // example function f(req, res) { const userId = req.get('id') return findUser(userId) .then((user) => findReceipt(user.bookName)) .then((receipt) => res.status(200).json(receipt)) .catch((err) => res.status(500).json(null)) } // register your handler app.get('/book', f)