执行几个猫鼬查询:如何使用的承诺呢?(Executing several mongoose quer

2019-08-02 07:00发布

我有以下的代码,我想避免嵌套的回调:

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

有任何想法吗?

Answer 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


Answer 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);
};


文章来源: Executing several mongoose queries: how to use promises instead?