在Node中读取与fs.readFile串联的文件?

时间:2018-12-18 12:00:53

标签: javascript node.js asynchronous fs synchronous

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

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

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

遵循约束条件,有什么方法可以实现功能?

3 个答案:

答案 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);