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

时间:2017-02-27 10:33:04

标签: node.js asynchronous large-files

我遇到NodeJ的异步性问题。 例如,我有以下代码,它读取一个巨大的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对象,我不知道何时/何处理它们。

后        this.spot_parser = new json_spot_parser(m_path);

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

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

所以,我的问题是:

NodeJs程序员如何处理问题?

请告诉我标准方式,我想要擅长这个NodeJs。 THX!

2 个答案:

答案 0 :(得分:2)

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

首先,在json_spot_parser

中返回一个新的承诺
var json_spot_parser = function(path){
  return new Promire(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.

答案 1 :(得分:1)

你应该在回调中处理它们 - 你上面的代码看起来很不错,你究竟想做什么但却无法做到?