Skip to content Skip to sidebar Skip to footer

Node.js: How To Pass Variables To Asynchronous Callbacks?

I'm sure my problem is based on a lack of understanding of asynch programming in node.js but here goes. For example: I have a list of links I want to crawl. When each asynch reques

Solution 1:

Your url variable is not scoped to the for loop as JavaScript only supports global and function scoping. So you need to create a function scope for your request call to capture the url value in each iteration of the loop by using an immediate function:

var links = ['http://google.com', 'http://yahoo.com'];
for (link in links) {
    (function(url) {
        require('request')(url, function() {
            console.log(url);
        });
    })(links[link]);
}

BTW, embedding a require in the middle of loop isn't good practice. It should probably be re-written as:

var request = require('request');
var links = ['http://google.com', 'http://yahoo.com'];
for (link in links) {
    (function(url) {
        request(url, function() {
            console.log(url);
        });
    })(links[link]);
}

Solution 2:

Check this blog out. A variable can be passed by using .bind() method. In your case it would be like this:

var links = ['http://google.com', 'http://yahoo.com'];
for (link in links) {
var url = links[link];

require('request')(url, function() {

    console.log(this.urlAsy);

}.bind({urlAsy:url}));
}

Solution 3:

See https://stackoverflow.com/a/11747331/243639 for a general discussion of this issue.

I'd suggest something like

var links = ['http://google.com', 'http://yahoo.com'];

functioncreateCallback(_url) {
    returnfunction() {
        console.log(_url);
    }
};

for (link in links) {
    var url = links[link];
    require('request')(url, createCallback(url));
}

Post a Comment for "Node.js: How To Pass Variables To Asynchronous Callbacks?"