Skip to content

Instantly share code, notes, and snippets.

@fengmk2
Created July 15, 2011 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fengmk2/1084423 to your computer and use it in GitHub Desktop.
Save fengmk2/1084423 to your computer and use it in GitHub Desktop.
Callback VS Event
/**
* 显示指定用户 profile 页面
*
* 获取关注和被关注的数据
* 获取此用户最近的活动数据
* - 活动数据里面包含各种数据的聚合
* 判断当前登录的用户与指定用户是否已经相互关注
*
*/
// callback
exports._show = function(req, res, next) {
var current_user_id = req.session.user_id;
var query = {user_id: req.user.id};
if(req.query.max) {
query.create_at = {$lt: new Date(req.query.max)};
}
var relation_reader = read_relaction(req.user.id, current_user_id);
var follow_counts_reader = read_follower_and_following_counts(req.user.id);
get_logs(query, function(err, logs) {
if(err) return next(err);
relation_reader(function(err, relation) {
if(err) return next(err);
if(relation && relation.length > 0) {
req.user.focus = true;
}
follow_counts_reader(function(err, follower_count, following_count) {
if(err) return next(err);
req.user.follower_count = follower_count;
req.user.following_count = following_count;
if(req.xhr) {
res.partial('log', logs);
} else {
res.render('user/detail', {user: req.user, logs: logs});
}
});
});
});
};
// change to EventEmitter
exports.show = function(req, res, next) {
var current_user_id = req.session.user_id
, query = {user_id: req.user.id};
if(req.query.max) {
query.create_at = {$lt: new Date(req.query.max)};
}
var event = new EventEmitter(), locals = {}, step_count = 3;
if(req.xhr) {
step_count = 1;
}
event.on('step_done', function() {
if(--step_count == 0) {
event.emit('finished');
}
});
event.on('finished', function() {
if(req.xhr) {
res.partial('log', locals.logs);
} else {
if(!locals.user) {
locals.user = req.user;
}
res.render('user/detail', locals);
}
});
event.on('error', function(err) {
event.removeAllListeners();
next(err);
});
if(!req.xhr) {
if(current_user_id) {
Relation.findOne({uid: req.user.id, fid: current_user_id}, function(err, relation) {
if(err) {
event.emit('error', err);
} else {
if(relation) {
req.user.focus = true;
}
event.emit('step_done');
}
});
} else {
event.emit('step_done', 'relation', null);
}
read_follower_and_following_counts(req.user.id)(function(err, follower_count, following_count) {
if(err) {
return event.emit('error', err);
}
req.user.follower_count = follower_count;
req.user.following_count = following_count;
event.emit('step_done');
});
}
get_logs(query, function(err, logs) {
if(err) {
return event.emit('error', err);
}
locals.logs = logs;
event.emit('step_done');
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment