Javascript 读取节点中与fs.readFile串联的文件?

Javascript 读取节点中与fs.readFile串联的文件?,javascript,node.js,asynchronous,fs,synchronous,Javascript,Node.js,Asynchronous,Fs,Synchronous,我将任意数量的文件路径作为字符串存储在数组中 我需要连续读取这些文件(即,在开始读取下一个文件之前先读取一个文件),并在每次读取文件后输出文件长度。读取完所有文件后,打印“完成” 我只允许使用fs.readFile和本机Javascript。不允许使用fs.readFileSync或任何其他模块。另外,我在节点v6上,所以不能使用async/await 是否有任何方法可以按照约束条件实现功能 是否与节点中的fs.readFile同步读取文件 没有 异步函数是异步的 它们不能转换为同步函数 即使您

我将任意数量的文件路径作为字符串存储在数组中

我需要连续读取这些文件(即,在开始读取下一个文件之前先读取一个文件),并在每次读取文件后输出文件长度。读取完所有文件后,打印
“完成”

我只允许使用
fs.readFile
和本机Javascript。不允许使用
fs.readFileSync
或任何其他模块。另外,我在节点v6上,所以不能使用async/await

是否有任何方法可以按照约束条件实现功能

是否与节点中的fs.readFile同步读取文件

没有

异步函数是异步的

它们不能转换为同步函数

即使您可以使用
await
(您已经排除了这一点),它仍然是异步的,只是语法允许您在更广泛的仍然是异步的上下文中以同步样式编写代码

大部分JavaScript都是异步的。拥抱它。倾向于使用承诺。不要试图反抗它

我需要按顺序读取这些文件(即完成一个文件的读取 在开始读取下一个之前),并输出文件长度 每次读取文件后。读取完所有文件后,打印 “完成”

编写一个沿数组迭代的递归函数。读取文件后,根据您是在数组末尾还是现在,增加迭代器并递归,或者打印完成

是否与节点中的fs.readFile同步读取文件

没有

异步函数是异步的

它们不能转换为同步函数

即使您可以使用
await
(您已经排除了这一点),它仍然是异步的,只是语法允许您在更广泛的仍然是异步的上下文中以同步样式编写代码

大部分JavaScript都是异步的。拥抱它。倾向于使用承诺。不要试图反抗它

我需要按顺序读取这些文件(即完成一个文件的读取 在开始读取下一个之前),并输出文件长度 每次读取文件后。读取完所有文件后,打印 “完成”


编写一个沿数组迭代的递归函数。读取文件后,根据您是在数组末尾还是现在,增加迭代器和递归或打印完成。

尝试使用
生成器。
在示例代码中,将acync函数替换为读取文件

//模拟异步操作
常量stt=(解析,str)=>{
设置超时(
() => {
console.log(str);
决心(str);
},
2000
);
}
//创建返回承诺的函数数组
常量arrFunc=['foo','bar','baz','qux']
.减少(
(acc,str)=>{
acc.push(()=>{
返回新承诺(解决=>{
stt(resolve,str);
});
});
返回acc;
}, []
);
函数*生成器(){
for(let func of arrFunc){
屈服函数();
}
}
常量迭代器=生成器();
函数quasiCo(生成器,值){
const next=generator.next();
console.log(下一步);
如果(!next.done){
next.value.then(res=>{
quasiCo(发电机,res);
});
}
}

拟迭代器尝试使用
生成器
。 在示例代码中,将acync函数替换为读取文件

//模拟异步操作
常量stt=(解析,str)=>{
设置超时(
() => {
console.log(str);
决心(str);
},
2000
);
}
//创建返回承诺的函数数组
常量arrFunc=['foo','bar','baz','qux']
.减少(
(acc,str)=>{
acc.push(()=>{
返回新承诺(解决=>{
stt(resolve,str);
});
});
返回acc;
}, []
);
函数*生成器(){
for(let func of arrFunc){
屈服函数();
}
}
常量迭代器=生成器();
函数quasiCo(生成器,值){
const next=generator.next();
console.log(下一步);
如果(!next.done){
next.value.then(res=>{
quasiCo(发电机,res);
});
}
}

拟迭代器实现这一点不需要任何花哨的东西,比如承诺、异步/等待、生成器

function readAllFiles(list) {
  if(list.length == 0) return
  console.log('reading ', list[0])
  return fs.readFile(list[0], function (err, file) {
    if (err) console.error(err); // report the error and continue
    console.log('list[0]' length:', file.length); // report the file length
    readAllFiles(list.slice(1, list.length))
  })
}

var l = ['1', 'foo', 'bar']

readAllFiles(l)

您不需要任何花哨的东西,如承诺、异步/等待、生成器来实现这一点

function readAllFiles(list) {
  if(list.length == 0) return
  console.log('reading ', list[0])
  return fs.readFile(list[0], function (err, file) {
    if (err) console.error(err); // report the error and continue
    console.log('list[0]' length:', file.length); // report the file length
    readAllFiles(list.slice(1, list.length))
  })
}

var l = ['1', 'foo', 'bar']

readAllFiles(l)

是的,您需要使用一次读取的回调来知道何时开始下一次读取。。。承诺(可能需要在这样一个古老的节点上建立一个库)将使它变得更加强大easier@JaromandaX是的,我想这就是我的想法。但是,我如何在任意大小的数组上实现它呢?我喜欢使用array reduce并承诺完成此类任务-但这绝不是唯一的方法对
fs的约束;这是家庭作业吗?是的,你需要使用一次阅读的回调来知道什么时候开始下一次阅读。。。承诺(可能需要在这样一个古老的节点上建立一个库)将使它变得更加强大easier@JaromandaX是的,我想这就是我的想法。但是,我如何在任意大小的数组上实现它呢?我喜欢使用array reduce并承诺完成此类任务-但这绝不是唯一的方法对
fs的约束;这是家庭作业吗?顺便说一句,当使用递归时,应该始终记住堆栈不是无限的。如果要以这种方式处理长列表,可以将嵌套的
readAllFiles
包装在
setTimeout
/
setImmediate
中。更多详细信息:@AlexPovar这不会导致堆栈溢出错误,因为
readAllFiles
不会调用自身。它由我们传递给
fs.readFile
function.btw的回调调用,当使用递归时,应该始终记住堆栈不是无限的。如果要以这种方式处理长列表,可以将嵌套的
readAllFiles
包装在
setTimeout
/
setImmediate
中。更多d