【问题标题】:fs.createReadStream loop not completingfs.createReadStream 循环未完成
【发布时间】:2020-11-27 04:11:53
【问题描述】:

我正在遍历一个包含本地文件的对象,所有这些文件都肯定存在,将它们读入缓冲区并在每个完成时递增一个计数器。问题是尽管有 319 个文件要读取,但很少(如果有的话)将计数器打印到控制台,显示它通过了所有文件。它神秘地停在 200 的某个地方……每次都不同,而且没有抛出任何错误。

我在一个电子项目中运行它,构建的应用程序在 Mac 上无缝运行,但在 Windows 上无法通过这个循环!我最近更新了所有的包,并在其他方面进行了必要的调整,整个应用程序运行良好.. 除了这个,它让我发疯!

代码如下:

$.each(compare_object, function(key, item) {
    console.log(item.local_path); // this correctly prints out every single file path
    var f = fs.createReadStream(item.local_path);

    f.on('data', function(buf) {
        // normally some other code goes in here but I've simplified it right down for the purposes of getting it working!
    });

    f.on('end', function(err) {
        num++;
        console.log(num); // this rarely reached past 280 out of 319 files. Always different though.
    });

    f.on('error', function(error) {
        console.log(error); // this never fires.
        num++;
    });
});

我想知道是否有一个缓存已用尽,或者我是否应该在每次“结束”后销毁缓冲区,但我读过的任何内容都没有表明这一点,即使我尝试过也没有什么区别。很多示例都希望您将其管道传输到某个地方,而我不是。在完整代码中,它会创建完整文件的哈希值并将其添加到每个本地文件的对象中。

【问题讨论】:

  • 你用数据做什么?你能用几句话解释一下吗,你是在以某种方式聚合数据吗?
  • 一般来说:您将同步代码与异步代码混合在一起。您的代码将同时打开 200 个(或多少个?)文件,这可能是个问题。
  • @kharandziuk 我正在创建读取的每个本地文件的哈希值,然后将该哈希值保存到先前创建的对象中。最终目标是能够将本地文件哈希与 Dropbox 中相同文件的哈希进行比较,以查看文件是否已被修改。在我更新电子和所有节点模块之前,它一直运行良好 - 为什么会改变?
  • node.js 中至少有 3 个版本的流 API。可能,您更新了一个版本的电子,它更新了一个为您提供新版本的流 API 的节点版本。 medium.com/the-node-js-collection/… - 在这里您可以找到流的简史
  • f.on('data', function(buf) { - 你是通过附加缓冲区来构建整个文件吗?

标签: javascript jquery node.js electron


【解决方案1】:

我相信循环在这里完成。问题:您正在放置一些异步处理程序。这里最简单的解决方案是在没有流的情况下重写代码。

const fs = require('fs')
const util = require('util')


const asyncReadFile = util.promisify(fs.readFile)

//.. this loop goes into some function with async or you can use readFileAsync
for (let [key, item] of Object.entries(compare_object)) {
  const data = await asyncReadFile(item.local_path)
  ///. here goes data handling
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2019-06-18
    • 2015-02-28
    相关资源
    最近更新 更多