What is a callback? A callback is a function to be executed after another function is executed. Sounds tongue-twisted? Normally if you want to call function do_b
after function do_a
the code looks something like
function do_a(){ console.log( '`do_a`: this comes out first'); } function do_b(){ console.log( '`do_b`: this comes out later' ); } do_a(); do_b();
Result
`do_a`: this comes out first `do_b`: this comes out later
However javascript is an event driven language. If do_a
takes longer than do_b
, the result of do_b
comes out first than do_a
;
function do_a(){ // simulate a time consuming function setTimeout( function(){ console.log( '`do_a`: this takes longer than `do_b`' ); }, 1000 ); } function do_b(){ console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' ); } do_a(); do_b();
Result
`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a` `do_a`: this takes longer than `do_b`
So how do we make sure do_b
comes out after do_a
in that situation? This is where callbacks comes in handy.
function do_a( callback ){ setTimeout( function(){ // simulate a time consuming function console.log( '`do_a`: this takes longer than `do_b`' ); // if callback exist execute it callback && callback(); }, 3000 ); } function do_b(){ console.log( '`do_b`: now we can make sure `do_b` comes out after `do_a`' ); } do_a( function(){ do_b(); });
Result
`do_a`: this takes longer than `do_b` `do_b`: now we can make sure `do_b` comes out after `do_a`
Different ways of applying a callback
function basic( callback ){ console.log( 'do something here' ); var result = 'i am the result of `do something` to be past to the callback'; // if callback exist execute it callback && callback( result ); } function callbacks_with_call( arg1, arg2, callback ){ console.log( 'do something here' ); var result1 = arg1.replace( 'argument', 'result' ), result2 = arg2.replace( 'argument', 'result' ); this.data = 'i am some data that can be use for the callback function with `this` key word'; // if callback exist execute it callback && callback.call( this, result1, result2 ); } // this is similar to `callbacks_with_call` // the only difference is we use `apply` instead of `call` // so we need to pass arguments as an array function callbacks_with_apply( arg1, arg2, callback ){ console.log( 'do something here' ); var result1 = arg1.replace( 'argument', 'result' ), result2 = arg2.replace( 'argument', 'result' ); this.data = 'i am some data that can be use for the callback function with `this` key word'; // if callback exist execute it callback && callback.apply( this, [ result1, result2 ]); } basic( function( result ){ console.log( 'this callback is going to print out the result from the function `basic`' ); console.log( result ); }); console.log( '--------------------------------------------------------------------------------------' ); ( function(){ var arg1 = 'i am argument1', arg2 = 'i am argument2'; callbacks_with_call( arg1, arg2, function( result1, result2 ){ console.log( 'this callback is going to print out the results from the function `callbacks_with_call`' ); console.log( 'result1: ' + result1 ); console.log( 'result2: ' + result2 ); console.log( 'data from `callbacks_with_call`: ' + this.data ); }); })(); console.log( '--------------------------------------------------------------------------------------' ); ( function(){ var arg1 = 'i am argument1', arg2 = 'i am argument2'; callbacks_with_apply( arg1, arg2, function( result1, result2 ){ console.log( 'this callback is going to print out the result from the function `callbacks_with_apply`' ); console.log( 'result1: ' + result1 ); console.log( 'result2: ' + result2 ); console.log( 'data from `callbacks_with_apply`: ' + this.data ); }); })();
Result
do something here this callback is going to print out the result from the function `basic` i am the result of `do something` to be past to the callback -------------------------------------------------------------------------------------- do something here this callback is going to print out the results from the function `callbacks_with_call` result1: i am result1 result2: i am result2 data from `callbacks_with_call`: i am some data that can be use for the callback function with `this` key word -------------------------------------------------------------------------------------- do something here this callback is going to print out the result from the function `callbacks_with_apply` result1: i am result1 result2: i am result2 data from `callbacks_with_apply`: i am some data that can be use for the callback function with `this` key word
Now we know how to execute node.js code, using require
and exports
, the importance of function scopes and closures and callbacks. Next we are going to take a look at the most important thing in node.js – Events.