Because Node.js works asynchronously, things might not work as you think, if you are still stuck in the synchronous world..
To pass variables into callback function, you can use bind()
.
I will show you how.
The dummy function that takes 1 sec to callback
To begin, let’s say we have this dummy()
function that will do some lengthy processing, and then callback. This is common. For example, a simple http request will use a callback function for the http response.
// A dummy function that callback after 1 second (simulating some processing work)
function dummy(i, callback) {
setTimeout(function() {
// After 1 second, we callback with a result
callback('dumb result')
}, 1000);
}
Incorrect Code
Now, let’s have a code that loops 10 times.
// Incorrect version
for (var i = 0; i < 10; i++) {
dummy(i, function(response) {
console.log("i = " + i + " , response = " + response);
})
}
You might think the code above will print out i
as 1-10.
But wrongly, it will print 10 every time!
This is because the callback from dummy()
takes 1 second before calling back. So by the time we print out, i
is already 10.
Correct Code
There is the correct way to pass variables such as i
into the callback function.
// Correct version
for (var i = 0; i < 10; i++) {
dummy(i, function(response) {
console.log("i = " + this.i + " , response = " + response);
}.bind( {i: i} ))
}
As you can see, I have used bind()
to pass the variables to function(response)
.
Then in the callback, I can access the variable with this.i
.