我有任意数量的文件路径作为字符串存储在数组中。
我需要依次读取这些文件(即在开始读取下一个文件之前先完成读取一个文件),并在读取每个文件后输出文件长度。读取完所有文件后,打印CollectionViewControllerB
。
只允许使用'done'
和本机Javascript。不允许fs.readFile
或任何其他模块。另外,我在Node v6上,所以不能使用async / await。
遵循约束条件,有什么方法可以实现功能?
答案 0 :(得分:4)
您不需要任何花哨的东西,例如promise,async / await,生成器即可实现。
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)
答案 1 :(得分:0)
与Node中的fs.readFile同步读取文件吗?
否。
异步函数是异步的。
它们不能变成同步功能。
即使您可以使用await
(已排除),它仍然是异步的,只是语法允许您在更广泛的上下文中以同步样式编写代码这是 still 异步的。
许多JavaScript是异步的。接受它。精益使用Promises。不要试图与之抗争。
我需要按顺序读取这些文件(即完成读取一个文件 在开始阅读下一个之前),并输出文件长度 每个文件读取之后。读取完所有文件后,打印 “完成”。
编写一个沿数组迭代的递归函数。读取文件后,请增加迭代器并递归或打印完成,具体取决于您是在数组的末尾还是现在。
答案 2 :(得分:0)
尝试使用generators
。
在示例代码中,替换了acync函数以读取文件。
// emulate async action
const stt = (resolve, str) => {
setTimeout(
() => {
console.log(str);
resolve(str);
},
2000
);
}
// Create array of functions that return Promise
const arrFunc = ['foo', 'bar', 'baz', 'qux']
.reduce(
(acc, str) => {
acc.push(() => {
return new Promise(resolve => {
stt(resolve, str);
});
});
return acc;
}, []
);
function* generator() {
for (let func of arrFunc) {
yield func();
}
}
const iterator = generator();
function quasiCo(generator, value) {
const next = generator.next();
console.log(next);
if (!next.done) {
next.value.then(res => {
quasiCo(generator, res);
});
}
}
quasiCo(iterator);