2017-02-14 126 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'预先添加到任何调用中,但事件触发时的当前上下文无关紧要,因为我们总是预先安装相同的数组。我会尽可能经常使用第一个解决方案,但如果您因某种原因需要访问客户端,我想确保发布解决方法。 –