irom
irom

Reputation: 3596

nodejs callback don't understand how callback result come through argument

Seen and run code below, thought I understand closures... How that 'avatarUrl' in callback argument is received in 'avatar'which is function argument too. I know this is common pattern, just can't get it yet

var GitHubApi = require('github');
var github = new GitHubApi({
version: '3.0.0'
});

var getUserAvataWithCallback = function(user, callback) {
    github.search.users({q: user}, function(err,res) {
        if (err) { callback(err, null);}
        else {
            var avatarUrl = res.items[0].avatar_url;
            callback(null, avatarUrl);
         }
    });
};


getUserAvataWithCallback('irom77', function(err,avatar) {
    console.log('got url with callback pattern', avatar);
})

Upvotes: 0

Views: 71

Answers (2)

Nikhil Saldanha
Nikhil Saldanha

Reputation: 151

So, callbacks are an underlying and integral concept in javascript, so it is important that you understand a few concepts. Look at this example:

// This is the function definition for "foo"

//here the callback argument refers to
//the second argument in the function call at
//the bottom which is a function

var foo = function(arg, callback) {
  
  if(arg%2 != 0)
    callback("arg is odd", arg)
    
  else
    callback(null, arg)
}
//Function call to foo
foo(2, function(err, num) {
  if(err)
    console.log(err)
  else
    console.log(num)
}

So, in the example above, you can think of the function call as a call with two parameters, the integer 2 and a function.

In the function definition:

The integer is referred to as "arg" and the function is referred to as "callback".

  1. When callback("arg is odd", arg) is executed, the function is called with:

    • err = "arg is odd"
    • num = arg
  2. When callback(null, arg) is executed, the function is called with:

    • err = null
    • num = arg

The important thing to remember here is that in javascript, functions can be passed as arguments to other functions. Do some further reading here.

Upvotes: 1

taxicala
taxicala

Reputation: 21759

The name of the argument passed to a function does not need to be the name of the argument in the definition of the function, the argument in the definition is the name of the variable that will be initialized inside the scope of given function. The argument declaration will receive the value passed at the second position of the function call (as per the code you've provided) and you will be able to access it inside the scope with that name. You can:

function foo(arg1, arg2) {
    console.log(arg1, arg2);
}

foo(true, true); // will output true, true
foo(0, 1); //will output 0, 1
foo('shikaka', 1); //will output "shikaka", 1

var bar = "shikaka";
foo(bar, "shikaka"); //will output "shikaka", "shikaka"

Upvotes: 1

Related Questions