执行几个 mongoose 查询:如何改用 Promise?
Posted
技术标签:
【中文标题】执行几个 mongoose 查询:如何改用 Promise?【英文标题】:Executing several mongoose queries: how to use promises instead? 【发布时间】:2012-10-24 12:44:24 【问题描述】:我有以下代码,我想避免嵌套回调:
app.get '/performers', (req, res) ->
conductor = require('models/conductor').init().model
soloist = require('models/soloist').init().model
orchestra = require('models/orchestra').init().model
chamber = require('models/chamber').init().model
performers =
conductor.find , (err, result) ->
performers.conductor = result
soloist.find , (err, result) ->
performers.soloist = result
orchestra.find , (err, result) ->
performers.orchestra = result
chamber.find , (err, result) ->
performers.chamber = result
res.json performers
有什么想法吗?
【问题讨论】:
【参考方案1】:我发现async
库是比此类事情的承诺更清洁的解决方案。对于这种特定情况,async.parallel
会很好用。
我对 coffeescript 不太熟悉,但它看起来像这样:
performers =
async.parallel [
(callback) ->
conductor.find , (err, result) ->
performers.conductor = result
callback err
(callback) ->
soloist.find , (err, result) ->
performers.soloist = result
callback err
(callback) ->
orchestra.find , (err, result) ->
performers.orchestra = result
callback err
(callback) ->
chamber.find , (err, result) ->
performers.chamber = result
callback err
], (err) ->
res.json performers
【讨论】:
你能解释一下每个函数中的第一个return语句吗? 我已更新示例以使用对象而不是数组。这样并行执行就会为您构建对象。 gist.github.com/kim3er/6594588【参考方案2】:你也可以这样组织你的代码:
exports.index = function(req, res)
var _self = ;
var foundItems = function(err, items)
_self.items = items;
res.render('index', user: _self.user, items: _self.items, lists: _self.lists );
;
var foundLists = function(err, lists)
_self.lists = lists;
Items.find().exec(foundItems);
;
var foundUser = function(err, user)
_self.user = user;
List.find().exec(foundLists);
;
User.findById(user).exec(foundUser);
;
【讨论】:
我不确定我们在这里讨论的情况是否相同。 每个 find 回调都接受一个函数,这是一种扁平化发生的嵌套的方法。我认为异步库可能更具可读性..以上是关于执行几个 mongoose 查询:如何改用 Promise?的主要内容,如果未能解决你的问题,请参考以下文章
如何动态构建具有 objectId 的 mongoose 查询?
如何动态构建具有 objectId 的 mongoose 查询?