Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS与并行流_Node.js - Fatal编程技术网

Node.js NodeJS与并行流

Node.js NodeJS与并行流,node.js,Node.js,我是新来的NodeJS。一个让我困惑的问题是平行流。我阅读了一个示例,其中显示了此代码段作为控制并行流的一种技术: 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) {

我是新来的NodeJS。一个让我困惑的问题是平行流。我阅读了一个示例,其中显示了此代码段作为控制并行流的一种技术:

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]();
    }
});
这段代码很有魅力,但是当我用

    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]();
    }

它没有像我预期的那样工作,因为循环中的文件[index]总是目录中的最后一个文件。您能解释一下真正的流程是什么吗?

简而言之,您创建的函数引用了索引变量(而不是它的值),因此在执行时,索引值是您案例中目录中的最后一个文件


一些链接:

其索引引用将指向其最后一个文件。节点js是异步的,它不会等到读取文件操作完成。它将增加索引值

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);
}
因为第一个代码使用闭包并将当前索引文件传递给函数。它将获取当前索引文件并返回一个函数,该函数将该文件作为输入


现在,返回的函数将并行执行。

您的链接非常有用。非常感谢。