【问题标题】:Executing several mongoose queries: how to use promises instead?执行几个 mongoose 查询:如何改用 Promise?
【发布时间】: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

有什么想法吗?

【问题讨论】:

    标签: asynchronous coffeescript express mongoose promise


    【解决方案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 回调都接受一个函数,这是一种扁平化发生的嵌套的方法。我认为异步库可能更具可读性..
    猜你喜欢
    • 2019-04-09
    • 2014-01-09
    • 1970-01-01
    • 2017-07-21
    • 2018-02-01
    • 2017-10-19
    • 2018-09-09
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多