2017-02-14 130 views
0

我正在使用npm-mqtt從另一個mqtt代理獲取數據。在mqtt回調範圍之外訪問類屬性

在接收的每條消息上,我想將數據添加到類/組件數組屬性中。

但我無法訪問該類或其屬性。相反,示波器說我在mqtt客戶端類對象中。

這裏是一個代碼示例:

this.mydata: Array<any> = []; 

private fetchWithMqtt(){ 
var client = mqtt.connect('ws://' + this.ip + ":" + Number(this.port) + "/mqtt"); 
     // set callback handlers 
     client.on('close', this.onConnectionLost); 
     client.on('message', this.onMessageArrived); 
     client.on('connect', this.onConnect); 
} 

private onMessageArrived(topic, message) { 
     let tempDataset = JSON.parse(message).dataset; 
      this.mydata.push({ //this.mydata is undefined because this = mqtt-client 
       x: tempDataset[0], 
       y: tempDataset[1] 
      }); 

我怎樣才能將數據推到我的類屬性此範圍之外?

回答

1

使用.bind(this),您可以確保this在您的事件被調用時不會改變。

你的代碼會是這個樣子:

this.mydata: Array<any> = []; 

private fetchWithMqtt(){ 
    var client = mqtt.connect('ws://' + this.ip + ":" + Number(this.port) + "/mqtt"); 
    // set callback handlers 
    client.on('close', this.onConnectionLost.bind(this)); 
    client.on('message', this.onMessageArrived.bind(this)); 
    client.on('connect', this.onConnect.bind(this)); 
} 

private onMessageArrived(topic, message) { 
    let tempDataset = JSON.parse(message).dataset; 
    this.mydata.push({ 
     x: tempDataset[0], 
     y: tempDataset[1] 
    }); 

但是,如果你需要訪問事件處理程序中的client?那麼你仍然可以使用綁定,但在事件處理程序中加入mydata並將其作爲參數。

現在您的代碼變成:

this.mydata: Array<any> = []; 

private fetchWithMqtt(){ 
    var client = mqtt.connect('ws://' + this.ip + ":" + Number(this.port) + "/mqtt"); 
    // set callback handlers 
    client.on('close', this.onConnectionLost.bind(client, this.mydata)); 
    client.on('message', this.onMessageArrived.bind(client, this.mydata)); 
    client.on('connect', this.onConnect.bind(client, this.mydata)); 
} 

private onMessageArrived(mydata, topic, message) { 
    let tempDataset = JSON.parse(message).dataset; 
    mydata.push({ // this == client 
     x: tempDataset[0], 
     y: tempDataset[1] 
    }); 
+0

你的第二個方法是通過引用而不是值的副本?否則這將無法按預期工作。 – Wandang

+1

我的第二種方法是通過引用傳遞'this.mydata',並且在引用時'this'仍然是你的類實例,而不是mqtt。所以它只是將'this.mydata'預先添加到任何調用中,但事件觸發時的當前上下文無關緊要,因爲我們總是預先安裝相同的數組。我會盡可能經常使用第一個解決方案,但如果您因某種原因需要訪問客戶端,我想確保發佈解決方法。 –