2017-02-14 5 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にアクセスする必要がある場合は?さて、あなたは引き続きbindを使うことができますが、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

私の2番目のアプローチは 'this.mydata'を参照渡ししています。参照時に' this'はまだmqttではなくクラスインスタンスです。だから、 'this.mydata'を呼び出すだけで、イベントのトリガが問題にならないときの現在のコンテキストは、常に同じ配列を前に置いているためです。私は可能な限り頻繁に最初の解決策をとるつもりですが、何らかの理由でクライアントにアクセスする必要がある場合は、回避策を投稿するようにしたいと考えていました。 –