read

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.


Image

@samwize

¯\_(ツ)_/¯

Back to Home