逐一读取文件并解决它们

时间:2019-10-10 15:25:33

标签: javascript node.js typescript

我需要读取的文件夹中有数百个文件。当前,我正在使用一种方法,该方法读取所有文件,然后将内容作为数组返回。但是我需要更改它,以便我读取文件并将其发送到客户端,然后读取第二个文件,直到最后...以便使它更有效。有什么建议吗?

当前代码:

const fse = require("fs-extra");
const path = require("path");
return (
  fse
    .readdir(direc)
    .then((filenames: any) => {
      return filenames.map((filename: any) => path.join(direc, filename));
    })
    .then((filepaths: any) => {
      return filepaths.map((filepath: any) =>
        fse.readFile(filepath).then((filecontents: any) => {
          return JSON.parse(filecontents);
        })
      );
    })
    // Promise.all consumes an array of promises, and returns a
    // new promise that will resolve to an array of concrete "answers"
    .then((filecontents: any) => Promise.all(filecontents))
    .then((realcontents: any) => {
      return realcontents;
    })
);

1 个答案:

答案 0 :(得分:1)

与其将所有文件读取诺言放在一个数组中,然后调用Promise.all,而是将它们链接在一起。我对Typescript语法不太熟悉,因此我将以纯JS语言提供示例代码,希望您可以转换所需的任何内容:

// ...
.then(filepaths => {
  let promise = Promise.resolve();
  filepaths.forEach(filepath => {
      promise = promise
                .then(() => fs.readFile(filePath))
                .then(handleFile)
                .catch(handleError);
  });
  return promise;
})
// ...

然后,您只需要创建一个handleFile函数,该函数可以接收单个文件的文件内容并对其进行任何处理(解析文件,通过响应将数据发送回去,等等)。这样,将按顺序处理每个文件。您还将希望handleError函数也返回已解决的Promise,因此,一次失败的文件读取不会破坏整个链。