JSFiddle - React, Tailwind, and code Playground

JavaScript

function getUserDashboardData(db, userId, callback) {
  // using async.auto    
  async.auto({
      db: async.apply(bindData, db),
      userId: async.apply(bindData, userId),
      user: ['db', 'userId', getUserFromDatabase],
      friends: ['user', getUserFriends],
      discussions: ['user', getUserDiscussions],
      friendRecommendations: ['user',
                              'friends', 
                              getUserFriendRecommendations],
      interestingDiscussions: ['discussions',
                               getUserInterestingDiscussions]
    },
    _.partialRight(processResults, callback)
  );
}

function bindData(data, callback) {
  callback(null, data);
}

function getUserFromDatabase(callback, data) {
  data.db.read('users', 'id = ?', data.userId, callback);
}

function getUserFriends(callback, data) {
  data.db.read('friends', 'user_id = ?', data.user.id, callback);
}

function getUserDiscussions(callback, data) {
  data.db.read('discussions', 'user_id = ?', data.user.id, callback);
}

function getUserFriendRecommendations(callback, data) {
  var friendIds = _.pluck(data.friends, 'id');
  var userId = data.user.id;
    
  data.db.read('friend_recommendations', 'user_id = ? and friend_id in ?',
               userId, 
               friendIds, 
               callback);
}

function getUserInterestingDiscussions(callback, data) {
  var discussionIds = _.pluck(data.discussions, 'id');
    
  data.db.read('interesting_discussions', 'id in ?',
               discussionIds,
               callback);
}

function processResults(err, results, callback) {
  if (err) return callback(err, undefined);
    
  var data = {
      user: results.user,
      friends: results.friends,
      discussions: results.discussions,
      friendRecommendations: results.friendRecommendations,
      interestingDiscussions: results.interestingDiscussions
  };
    
  callback(null, data);
}