2017-09-29 24 views
-2

我有一個類,它在NodeJS中管理我與我的套接字的連接。每當無法建立連接或丟失連接時,我想設置一個間隔以保持重試連接。但是,如果我調用setInterval函數,則作爲參考傳遞的方法現在處於setInterval的範圍內。我的套接字類中的方法現在不再可用,除非我有一些巨大的嵌套語句,否則我無法重新連接套接字。主要的問題是我在connect()方法中創建的事件偵聽器現在不再在setInterval()的範圍內可用。在javascript中使用setInterval時保持在類的範圍內

關於如何使這項工作的任何想法?

class SocketClass { 

    constructor() { 
    this.socket = {} 
    this.port = 0 
    this.host = '' 
    this.intervalID = null 
    } 


    connect(port, host) { 
    this.port = port; 
    this.host = host; 
    this.connectImpl() 
    this.socket.on('error',() => this.errorEventHandler()) 
    this.socket.on('close',() => this.closeEventHandler()) 
    } 

    connectEventHandler() { 
    console.log('Connected!') 
    if (this.intervalID !== null) { 
     clearInterval(this.intervalID); 
    } 
    } 

    errorEventHandler() { 
    console.log('Error!') 
    } 

    connectImpl() { 
    console.log('Trying to connect...') 
    this.socket = require('net').Socket().connect(this.port, this.host) 
    } 

    closeEventHandler() { 
    console.log('Connection lost') 
    this.intervalID = setInterval(() => this.connectImpl(), 1000) 
    // this.connectImpl() is called correctly but the event 
    // handlers defined in the constructor are now no longer bound 
    } 

} 

export default new SocketClass 
+0

我發現downvotes令人難以置信的難以捉摸。我的問題很簡單,包括代碼。有人真的喜歡粉碎那個downvote按鈕.. – Ortix92

+0

擊敗我 - 有人downvoted我的完美的答案太... – Alnitak

+0

至於明確:_「我通過作爲參考的方法現在在setInterval的範圍內」_ - 沒有,那是不正確的。 _「我的套接字類中的方法現在不再可用」_ - 不正確。 _「我在connect()方法中創建的事件偵聽器現在不再在setInterval()的範圍內可用(_」 - 也是不正確的。 – Alnitak

回答

3

儘管您的評論說什麼,你實際上並沒有打電話給你connectImpl處理程序:

this.intervalID = setInterval(() => this.connectImpl(), 1000) 

如果沒有額外的括號,你只是傳遞一個參考箭頭功能返回參考connectImpl函數

回覆:您的編輯 - 您需要將事件處理程序註冊移入connectImpl()方法。當您的計時器觸發時,這些處理程序在舊的套接字上保持註冊(但在收集垃圾時會消失),並且當前寫入的數據未附加到新創建的套接字。這不是範圍相關的問題。

您還需要確保在創建新計時器之前在closeEventHandler中調用clearInterval(this.intervalID),因爲「on close」處理程序也稱爲「出錯時」(至少對於某些錯誤)。

+0

我仍然有拼寫錯誤時意外粘貼了代碼。評論是正確的。括號已經包含在我的IDE中的代碼中。儘管如此,在我的第一篇文章中,我清楚地表明,我的類的範圍不再在'setInterval()'內部可用,這正是我想要解決的問題。 – Ortix92

+0

我回答了你當時問的問題。你的另一個問題是你需要在'connectImpl'方法中註冊這些處理程序 - 當你重新連接時,連接到第一次處理程序的this.socket實例不是同一個實例。 – Alnitak

+0

你其實沒有,因爲從我的問題來看,很明顯我知道這些處理程序沒有在'setInterval()'的範圍內註冊。除此之外,在'connectImpl'內註冊它們會導致內存泄漏,因爲如果我沒有連接,我會經常進入該方法。 – Ortix92

相關問題