2017-10-17 5 views
0

ストリーム(TCP接続)を取得し、そのストリームから引き出すデータイベントから独自のカスタムイベントを生成するイベントエミッタクラスを作成する例が見つかりました。ノードイベントエミッタ - クラスをクラスに変換する方法構文

私が何をしても、それをリメイクすることはできません。それはes6クラスの構文です。私は、これが可能でなければならないことをノード文書で見た。しかし、私はOOPの弱い背景を持っており、私は仕事を得ることができません。

誰かが簡単に理解できると確信しています。ときにそれを迷子にしないようにここで私は次のことを試してみた私の認識の甘さで元のクラス(拡張するためのES5スタイルコンストラクタ/ utilにモジュール...)

const MsgClient = function(stream) { 
    events.EventEmitter.call(this); 

    let self = this, buffer = ""; 

    stream.on("data", (data) => { 
    buffer += data; 
    let boundary = buffer.indexOf("\n"); 
    while (boundary !== -1) { 
     let input = buffer.substr(0, boundary); 
     self.emit("message", JSON.parse(input)); 
     buffer = buffer.substr(boundary + 1); 
     boundary = buffer.indexOf("\n"); 
    } 
    }) 
} 

util.inherits(MsgClient, EventEmitter); // from require("events").EventEmitter 

はあるが、私はただの背景を持っていません動作しません。あなたはそれに慣れていない場合は、誰が助けるかさえ、それははるかに高く評価されるだろう、ライト方向に私を指すことができれば、「これは」

class MsgClient extends EventEmitter { 
    constructor(stream) { 
    super(); 
    this.stream = stream; 
    this.buffer = ""; 
    self = this; 
    } 

    stream.on("data", (data) => { 
    buffer += data; 
    let boundary = buffer.indexOf("\n"); 

    while (boundary !== -1) { 
     let input = buffer.substr(0, boundary); 
     self.emit("message", JSON.parse(input)); 
     buffer = buffer.substr(boundary + 1); 
     boundary = buffer.indexOf("\n"); 
    } 
    }) 
}; 

...本当に複雑取得します。

class MsgClient extends EventEmitter { 
    constructor(stream) { 
    super(); 
    this.stream = stream; 
    this.buffer = ""; 

    stream.on("data", (data) => { 
     buffer += data; 
     let boundary = buffer.indexOf("\n"); 

     while (boundary !== -1) { 
     let input = buffer.substr(0, boundary); 
     this.emit("message", JSON.parse(input)); 
     buffer = buffer.substr(boundary + 1); 
     boundary = buffer.indexOf("\n"); 
     } 
    }) 
    } 
}; 

答えて

2

これを試してみてください。

class MsgClient extends EventEmitter { 
    constructor(stream) { 
    super(); 
    this.stream = stream; 
    this.buffer = ""; 
    this.onData = this.onData.bind(this); 
    stream.on("data", this.onData); 
    } 

    onData(data){ 
    buffer += data; 
    let boundary = buffer.indexOf("\n"); 

    while (boundary !== -1) { 
     let input = buffer.substr(0, boundary); 
     this.emit("message", JSON.parse(input)); 
     buffer = buffer.substr(boundary + 1); 
     boundary = buffer.indexOf("\n"); 
    } 
    } 
} 

EDIT:それは今コンパイルし、これがうまく働くことになった

0

するか、またすべき作品をこの、前の回答を試してみたが、おそらくあなたは、この方法でそれをやってみたかった:

+1

なぜ彼はおそらくそのようにしたいのですか?これはコンパイルされません。 – lilezek

+0

@lilezekはい、構文エラーです。 OPはES 6の構文を使いたいと思っていたので、Object Oriented Programingについて言及しました。 –

+0

はい、しかしなぜ彼はコンストラクタでのみ使用されていて、それをバインドしてメモリ使用量を増やしている「これ? – lilezek

0

動作するようにする必要があります

class MsgClient extends EventEmitter { 
    constructor(stream) { 
    super(); 
    let buffer = ""; 

    stream.on("data", (data) => { 
     buffer += data; 
     let boundary = buffer.indexOf("\n"); 

     while (boundary !== -1) { 
     let input = buffer.substr(0, boundary); 
     this.emit("message", JSON.parse(input)); 
     buffer = buffer.substr(boundary + 1); 
     boundary = buffer.indexOf("\n"); 
     } 
    }); 
    } 
}; 

私が行方不明になったものが全体の「stream.on」方法があったことでしたコンストラクタで正しく宣言されているので、それを指摘してくれてありがとう。このコードは元のes5型クラスと同じように機能するようになりました。

関連する問題