将Node.js fs.readFile的结果存储在变量中并传递给全局变量

23
我想知道是否可能将fs.readfile的内容传递到readfile方法的作用域之外,并将其存储在类似的变量中。
var a;

function b () {
    var c = "from scope of b";
    a = c;
}
b();

那么我可以使用console.log(a);将其输出,或者将其传递给另一个变量。

我的问题:

是否有一种方法可以使用fs.readFile实现这一点,以便将内容(data)传递给全局变量global_data?

var fs = require("fs");

var global_data;

fs.readFile("example.txt", "UTF8", function(err, data) {
    if (err) { throw err };
    global_data = data;
});

console.log(global_data);  // undefined

3
欢迎来到异步编程的奇妙世界!你不能这样做。 - SLaks
1
你正在尝试在同步上下文中访问异步上下文中的某些内容,这是行不通的。请参考以下链接(也请阅读下面的评论):https://dev59.com/j2Ag5IYBdhLWcg3wYaC6#34161451 - Rich Steinmetz
1个回答

43

你遇到的问题不是作用域问题,而是操作顺序问题。

由于readFile是异步的,console.log(global_data);在读取文件之前发生,也在执行global_data = data;之前发生。

正确的方式是:

fs.readFile("example.txt", "UTF8", function(err, data) {
    if (err) { throw err };
    global_data = data;
    console.log(global_data);
});

在一个简单的程序(通常不是Web服务器),您可能还想使用同步操作readFileSync,但通常最好不要停止执行。

使用readFileSync,您可以这样做:

var global_data = fs.readFileSync("example.txt").toString();

我只是想知道是否有可能将数据变量内容传递给全局global_data变量。console.log(global_data)仅用于显示它未定义。 - Paul
我认为你没有理解我的回答。将数据变量内容传递给全局global_data变量是可能的,这没有问题。但你遇到的问题是在填充变量之前执行了console.log。 - Denys Séguret
1
好的,那就是整个异步的事情了。但是使用readFileSync似乎没有帮助。在执行console.log之前填充变量是可能的吗?我想这就是我的问题。 - Paul
@DenysSéguret 使用readFileSync并转换为字符串是无济于事的,因为我的内容是对象。 - crazyCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接