function render_page(req, res) {
req.facebook.app(function(err, app) {
req.facebook.me(function(user) {
res.render('index.ejs', {
layout: false,
req: req,
app: app,
user: user
});
});
});
}
Ok, two nested functions just to get data.
My mind does something like...
function render_page(req, res) {
app = req.facebook.app(function(err, app) {
user = req.facebook.me(function(user) {
res.render('index.ejs', {
layout: false,
req: req,
app: app,
user: user
});
});
});
}
note that app and user could be obtained in parallel (concurrently)
But... same file some lines later...
function handle_facebook_request(req, res) {
// if the user is logged in
if (req.facebook.token) {
async.parallel([
function(cb) {
// query 4 friends and send them to the socket for this socket id
req.facebook.get('/me/friends', { limit: 4 }, function(friends) {
req.friends = friends;
cb();
});
},
...
function(cb) {
// use fql to get a list of my friends that are using this app
req.facebook.fql('SELECT uid, name, is_app_user, pic_square FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user = 1', function(result) {
req.friends_using_app = result;
cb();
});
}
], function() {
render_page(req, res);
});
} else {
render_page(req, res);
}
}
Send info to eltanin:
function handle_facebook_request_eltanin(req, res, me) {
eltanin.w('users').w(me).w('social/fb').put(
{fb_id:me, token:req.facebook.token}
).on('complete', function() {
handle_facebook_request(req, res, me);
});
}
More info to render:
function handle_facebook_request(req, res, me) {
// if the user is logged in
if (req.facebook.token) {
async.parallel([
...
function(cb) {
// = request product recommendations of the current person
eltanin.w('users').w(me).w('recommendations')
.q('limit',50).get().on('complete', function(data) {
req.recommendations = data;
cb();
});
},
...
], function() {
render_page(req, res);
});
} else {
render_page(req, res);
}
}
But...
when I finished...
and I get it running...
running fast...
my feeling was...
function render_page(req, res) {
var app = getFacebookApp();
var me = getFacebookMe();
Q.all([app, me], function (results) {
res.render('index.ejs', {
layout: false,
req: req,
app: results[0], // apps
user: results[1] // me
});
});
}
Implicit concurrency, easy composibility, less prone to bugs, code almost like always.