从 fs.readFile 获取数据异步同步

2022-08-29 23:45:58
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

日志 ,为什么?undefined


答案 1

为了详细说明@Raynos所说的内容,您定义的函数是异步回调。它不会立即执行,而是在文件加载完成后执行。调用 readFile 时,将立即返回控件并执行下一行代码。所以当你调用 console.log 时,你的回调还没有被调用,这个内容还没有设置。欢迎使用异步编程。

示例方法

const fs = require('fs');
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    const content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile(content);   // Or put the next step in a function and invoke it
});

function processFile(content) {
    console.log(content);
}

或者更好的是,正如Raynos示例所示,将调用包装在函数中并传入自己的回调。(显然这是更好的做法)我认为养成将异步调用包装在需要回调的函数中的习惯将为您节省很多麻烦和混乱的代码。

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});

答案 2

实际上有一个同步函数:

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

异步

fs.readFile(filename, [encoding], [callback])

异步读取文件的全部内容。例:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

回调传递两个参数(错误,数据),其中数据是文件的内容。

如果未指定编码,则返回原始缓冲区。


同步

fs.readFileSync(filename, [encoding])

fs.readFile 的同步版本。返回名为 filename 的文件的内容。

如果指定了编码,则此函数返回一个字符串。否则,它将返回一个缓冲区。

var text = fs.readFileSync('test.md','utf8')
console.log (text)