The callback hell that never was
Let's talk about callbacks, people seem to get terrified by them, because they see something like this:
var mysql = require('mysql'),db = mysql.createClient({user: 'root',password: 'root'}),id = 1;db.query('USE mydb', function (err) {//some code heredb.query('SELECT * FROM whatever WHERE id=?', [id], function (err, foo) {if (foo) {//some other codedb.query('UPDATE whatever SET bar=?', [foo.bar], function (err) {db.query('INSERT INTO someothertable (sometime) VALUES (NOW())', function () {//some codeconsole.log("It's done");});});}});//more code});
This has the potential to turn into hard to understand spaghetti code. But we don't have to write it like this, we don't have to inline every function we can simply name them instead.
var mysql = require('mysql'),db = mysql.createClient({user: 'root',password: 'root'}),id = 1;function init(fn) {db.query('USE mydb', fn);}function fetch(id, fn) {db.query('SELECT * FROM whatever WHERE id=?', [id], fn);}function checker(err, foo) {if (foo) {//some other codeupdate(foo.bar);}}function update(bar) {db.query('UPDATE whatever SET bar=?', [bar], function (err) {db.query('INSERT INTO someothertable (sometime) VALUES (NOW())', function () {//some codeconsole.log("It's done");});});}init(function () {fetch(id, checker);})
We could also put this in a module or wrap a (pseudo) class around it if we wanted to. The main point is that we don't have to nest inline callbacks to get the job done, we can name them.