Created
July 15, 2011 10:09
-
-
Save fengmk2/1084423 to your computer and use it in GitHub Desktop.
Callback VS Event
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 显示指定用户 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