读取巨大的 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.
我对 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
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.