前提・実現したいこと
サーバ上のログファイルを読込み、行ごとに処理を分岐させながらインスタンスの生成と値を設定したい。
ログは"-"で始まる区切り行と、それ以外のログ情報を持った行を持つ。
該当のソースコード
javascript
1const LogObj = require("./LogObj.js"); //自作モジュール 2 3module.exports = class LogReader{ 4 constructor(path){ 5 6 var fs = require("fs"); 7 var rs = fs.createReadStream("log.txt"); 8 var readline = require("readline"); 9 var rl = readline.createInterface(rs, {}); 10 11 rl.on("line", function(line) { 12 if( line.substr(0,1) == "-" ){ //ログは行頭が"-"の区切り行で1つのブロック 13 this.tmp.hoge(); //何かしら処理を行ったあと 14 this.tmp = new LogObj(); //インスタンスを再生成[※1] 15 }else{ 16 this.tmp.setlog(line); //ログの中身を追加するメソッド 17 } 18 }).on("close", function(){ 19 this.tmp.hoge(); //最後のセクションの処理 20 }) 21 } 22}
発生している問題・エラーメッセージ
最初のthis.tmp.setlog(line)実行時、setlogが未定義となる。
試したこと
[※1]行直後にthis.tmp.setlog("test")などを挟むと問題なく実行できているので、LogObj側の定義は問題ないはず。
コールバック関数内での処理なので、on内で定義したthis.tmpが処理後には空になる点は認識している。
しかしonで繰り返しループ処理を行っている間も保持されないのか?
本来はthis.tmpを配列にして次々オブジェクトをループの中でpushしたかったのですが、上記の通りonが非同期関数かつコールバック関数内ということもあり、他言語のように同期的な処理の書き方がわからず困っております。
難しければ、モジュール先頭にグローバル変数のようなものを置いて処理すべきなのかなとも思っております。
ただthisじゃないのがなんとなく美しくないなと…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/03 14:18