Tuan nguyen
Tuan nguyen

Reputation: 570

NodeJS and parallel flow

I'm new with NodeJS. An issue makes me confused is parallel flow. I read an example show this snippet as a technique for controlling parallel flow:

var fs = require('fs');
var fileDir = './files';

fs.readdir(filesDir, function (err, files) {
    if (err) throw err;

    for (var index in files) {
        var task = (function (file) {
            return function () {
                fs.readFile(file, function (err, text) {
                    if (err) throw err;
                    doSomething();
                });
            }
        })(filesDir + '/' + files[index]);

        tasks.push(task);
    }

    for (var index in tasks) {
        tasks[index]();
    }
});

This code work like a charm, but when I replace it with

    for (var index in files) {
        var task = function () {
            console.log(files[index]);
            fs.readFile(filesDir + '/' + files[index], function (err, text)   {
                if (err) throw err;
                doSomething();
            });
        };

        tasks.push(task);
    }

    for (var index in tasks) {
        tasks[index]();
    }

It doesn't work as I expected, because the files[index] in loop is always the last file in directory. Could you please explain me what the real flow is?

Upvotes: 0

Views: 77

Answers (2)

Govan
Govan

Reputation: 7781

Its because index reference will be to its last file. Node js is asynchronous that it ll not wait till read file operation is completed. It ll increment index value.

for (var index in files) {
    var task = function () {
        console.log(files[index]);
        fs.readFile(filesDir + '/' + files[index], function (err, text)   {
            if (err) throw err;
            doSomething();
        });
    };

    tasks.push(task);
}

Since first code uses closures and it passes the current indexed file to a function. It ll take the current indexed file and returns a function with the file as input.

Now that returned function will execute in parallel.

Upvotes: 1

user2786771
user2786771

Reputation: 79

In short, the function you created have reference for the index variable(not it's value), so when it's executed, the index value is the last file in directory in your case.

Some links: Understanding variable capture by closures in Javascript/Node

Upvotes: 1

Related Questions