我遇到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!
答案 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)
你应该在回调中处理它们 - 你上面的代码看起来很不错,你究竟想做什么但却无法做到?