执行几个 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 查询?

执行多个 Mongoose 查询

在 Mongoose 中一次执行多个查询

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组

mongoose连表查询2