Reputation: 3237
I have the following code and I would like to avoid nested callbacks:
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
Any ideas?
Upvotes: 1
Views: 2948
Reputation: 75656
You can also organize your code like this:
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);
};
Upvotes: 1
Reputation: 311845
I find the async
library to be a cleaner solution than promises for this sort of thing. For this specific case, async.parallel
would work well.
I'm not overly familiar with coffeescript, but it would look something like this:
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
Upvotes: 5