2017-10-17 39 views
0

我找到了一個創建事件發射器類的示例,它接收一個流(tcp網絡連接)並從它從該流中拉出的數據事件中發出它自己的自定義事件。節點事件發射器 - 如何將類轉換爲類語法

無論我做什麼,我都不能重拍它,將es6類​​語法。我在節點文檔中看到這應該是可能的。但是我有一個很弱的面向對象的背景,我無法讓這個東西工作。

我相信有人可以很容易地弄清楚壽。原來這裏是類(用於擴展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"); 
    } 
    }) 
}; 

如果有人可以幫助甚至點我這將是非常讚賞的寫入方向。

回答

2

試試這個:

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"); 
     } 
    }) 
    } 
}; 
0

或者試試這個,前面的答案也應該工作,但可能是你想要做這樣。

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"); 
    } 
    } 
} 

編輯:現在應該編譯和工作

+1

爲什麼「他可能想要」這樣做?這甚至沒有編譯。 – lilezek

+0

@lilezek是的,我犯了語法錯誤。我想這是因爲OP想要使用ES 6的語法,並提到了面向對象的編程 –

+0

是的,但是爲什麼他想要一個額外的函數,它只在構造函數中使用,並且由於內存使用限制而增加'this'? – 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類型一樣工作。