readFileSync和使用async / await在readFile之上使用promisify之间的区别

时间:2018-12-11 17:47:15

标签: javascript node.js async-await fs

出于好奇,我想知道两者之间是否有任何区别。

readFileSync:

function parseFile(filePath) {
  let data = fs.readFileSync(filePath);
}

readFile带有承诺:

const readFilePromise = promisify(fs.readFile);
async function parseFile(filePath) {
  let data = await readFilePromise(filePath);
}

如果需要一些上下文,请尝试读取文件夹中的一堆文件,在每个文件夹中替换许多值,然后重新写入。

我不知道使用异步或同步代码执行这些操作是否有任何区别。

完整代码:

function parseFile(filePath) {
  let data = fs.readFileSync(filePath);
  let originalData = data.toString();
  let newData = replaceAll(originalData);

  return fs.writeFileSync(filePath, newData);
}

function readFiles(dirPath) {
  let dir = path.join(__dirname, dirPath);
  let files = fs.readdirSync(dir); // gives all the files
  files.map(file => parseFile(path.join(dir, file)));
}

function replaceAll(text) {
  text = text.replace(/a/g, 'b');
  return text;
}

readFiles('/files');

1 个答案:

答案 0 :(得分:0)

异步和同步代码之间有很大的区别。这种差异是否重要取决于您要做什么。您的javascript是单线程线程,因此当您与fs.readFileSync同步读取潜在的大文件时,您将无法执行其他任何操作,例如响应传入的请求。

如果您正在运行繁忙的服务器,则可能会导致大问题,因为在读取文件时请求排队,并且您可能永远无法追上。

使用async方法,文件读取发生在代码之外,完成后会回叫代码。在执行此操作时,您的代码可以自由响应其他请求。

如果您只是尝试读取本地文件,而线程是否阻塞也没有关系,则可以使用其中任何一个。