读取巨大的 json 文件以及如何知道何时收到所有数据?

read huge json file and how to know when data is all been received?

我对 NodeJs 的异步特性有疑问。 例如,我有以下代码,它读取一个巨大的 json 文件

var json_spot_parser = function(path){

  this.count = 0;
  var self = this;
  let jsonStream = JSONStream.parse('*');
  let fileStream = fs.createReadStream(path);

   jsonStream.on('data', (item) => {
    // console.log(item) // which correctlt logged each json in the file
    self.count++;  //134,000
   });

   jsonStream.on('end', function () {
     //I know it ends here, 
   });

   fileStream.pipe(jsonStream);

};

json_spot_parser.prototype.print_count=function(){
  console.log(this.count);
}


module.export= json_spot_parser;

在另一个模块中,我将其用作

   var m_path =   path.join(__dirname, '../..', this.pathes.spots);  
   this.spot_parser = new json_spot_parser(m_path); 
   this.spot_parser.print_count();

我想读取所有 json 对象并处理它们。但异步是我的问题。我不熟悉那种编程。我以前是按顺序编程的,比如c,c++等等。

因为我不知道这些程序什么时候完成读取 json 个对象,所以我不知道 when/where 处理它们。

之后 this.spot_parser = 新 json_spot_parser(m_path);

我希望处理 json 个对象,但正如我所说我做不到。

我想有人解释一下在这种情况下如何编写 nodejs 程序,我想知道标准做法。到目前为止,我阅读了一些帖子,但我相信其中大部分都是短期修复。

那么,我的问题是:

NodeJs 程序员如何处理问题?

请告诉我标准方法,我想擅长这个NodeJs。 谢谢!

您应该在回调中处理它们 - 您上面的代码看起来很不错,您到底想做什么但做不到?

您可以按照@paqash 的建议使用回调,但return承诺会是更好的解决方案。

首先,return在json_spot_parser

中新建了一个Promise
var json_spot_parser = function(path){
  return new Promise(function(resolve, reject) {
    this.count = 0;
      var self = this;
      let jsonStream = JSONStream.parse('*');
      let fileStream = fs.createReadStream(path);
    
       jsonStream.on('data', (item) => {
        // console.log(item) // which correctlt logged each json in the file
        self.count++;  //134,000
       });
    
       jsonStream.on('end', function () {
         resolve(self.count);
       });
    
       fileStream.pipe(jsonStream);
    
    };
    
    json_spot_parser.prototype.print_count=function(){
      console.log(this.count);
    }
  }); 

module.export= json_spot_parser;

在另一个模块中

var m_path = path.join(__dirname, '../..', this.pathes.spots);  
this.spot_parser = new json_spot_parser(m_path); 
this.spot_parser.then(function(count) {console.log(count)});

如您所述,Node.js 具有异步机制,您应该学习如何以这种方式思考。如果您想擅长 Node.js,则需要它。如果我可以建议,您应该从这篇文章开始: Understanding Async Programming in Node.js

Ps:尝试使用驼峰式变量,并遵循Airbnb JS style guide.