【问题标题】:NodeJS and parallel flowNodeJS 和并行流
【发布时间】:2015-05-18 06:55:13
【问题描述】:

我是 NodeJS 的新手。一个让我感到困惑的问题是并行流。我阅读了一个示例,将这个 sn-p 显示为一种控制并行流的技术:

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

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

    简而言之,您创建的函数具有索引变量的引用(不是它的值),因此当它执行时,索引值是您的情况下目录中的最后一个文件。

    部分链接:Understanding variable capture by closures in Javascript/Node

    【讨论】:

    • 您的链接非常有用。谢谢
    【解决方案2】:

    这是因为索引引用将指向其最后一个文件。 Node 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);
    }
    

    由于第一个代码使用了闭包并将当前的索引文件传递给一个函数。它将获取当前的索引文件并返回一个以该文件为输入的函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2016-02-28
      相关资源
      最近更新 更多