gpt4 book ai didi

javascript - 在 NodeJS 的 while 循环中读取文件

转载 作者:行者123 更新时间:2023-11-30 20:28:19 24 4
gpt4 key购买 nike

我正在读取目录中的所有 json 文件,并在 Couchbase 中以循环方式对它们执行 CRUD 操作以进行一些性能基准测试。

function readFiles(dirName,crudOps, onError){
fs.readdir(dirName,function(err,filenames){
if (err) {
onError(err);
return;
}
var circularIterator = cyclicIterator(filenames);


while(1){
fname = circularIterator.next().value;

fs.readFile(dirName + fname, function(err, content) {
console.log(fname) // NEVER REACHES HERE
if (err) {
console.log(err);
return;
}
crudOps(fname, content);
});
});
}
})

}

但是,它似乎并没有执行fs.readFile 函数。如何使其“循环”遍历文件名列表并将文件内容用于我的 crudOps 函数?

编辑:

根据 Ry 的建议,我使用了 promise 来读取文件。

const readFile = util.promisify(fs.readFile);

async function getStuff(filename) {
return await readFile(filename);

}

function readFiles(dirName,onFileContent, onError){
fs.readdir(dirName,function(err,filenames){
if (err) {
onError(err);
return;
}
var iterator = circularIterator(filenames);

//filenames.forEach(function(filename) {
while(1){
fname = iterator.next().value;
//iterator.getNext(function(filename){
//
getStuff(dirName + fname).then(data => {console.log(data); onFileContent(fname, data)})

}
})

}

这挂起并导致我的 Chrome 浏览器崩溃,并在我的控制台上出现以下错误:

fatal error :CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足

有没有办法让它变得更好?

最佳答案

你不能无限量地读取文件,你可以找到你的计算机可以处理的最大数量并将程序限制到那个数量。

要限制事件,您可以递归调用一个函数,该函数将(如果未启动最大事件进程)读取文件并对其执行操作,如果完成则再次执行。

function readFiles(dirName, onFileContent, onError) {
fs.readdir(dirName, function (err, filenames) {
if (err) {
onError(err);
return;
}
const recur = (iterator) => {
const fname = iterator.next().value;
getStuff(dirName + fname)
.then(
data => {
console.log(data);
//if the following is an asynchronous function then
// you should wait for it to finish before calling recur
onFileContent(fname, data);
//recursively call itself
recur(iterator);
}
);
};
const iterator = circularIterator(filenames);
var i = 0;
while(i++<1000){//maximum amount of active tasks
recur(iterator);
}
})
}

工作示例:

var later = time => value =>
new Promise(
(resolve,reject)=>
setTimeout(
()=>resolve(value),
time
)
)
;
var waitTwoSeconds = later(2000);
function *myIterator(){
var i = 1;
while(i<=15){
yield i++;
}
}

function readFiles() {
const recur = (iterator) => {
const value = iterator.next().value;
if(value===undefined){
console.log("----- Done")
return;
}
waitTwoSeconds(value)
.then(
data => {
console.log("returned",data);
recur(iterator);
}
);
};
const iterator = myIterator();
var i = 0;
while(i++<5){
recur(iterator);
}
}
readFiles();

关于javascript - 在 NodeJS 的 while 循环中读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com