我需要读取的文件夹中有数百个文件。当前,我正在使用一种方法,该方法读取所有文件,然后将内容作为数组返回。但是我需要更改它,以便我读取文件并将其发送到客户端,然后读取第二个文件,直到最后...以便使它更有效。有什么建议吗?
当前代码:
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;
})
);
答案 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,因此,一次失败的文件读取不会破坏整个链。