Search code examples
angulartypescriptvert.xvertx-eventbus

Vert.x event bus client doesn't work in Angular 7 outside of a constructor


I try to use the vertx-eventbus-client.js 3.8.3 in my Angular web project. The following works fine:

declare const EventBus: any;`

@Injectable({`
    providedIn: 'root'
})
export class DeviceService implements OnInit {

    constructor(private httpClient: HttpClient) {

       var eb = new EventBus("http://127.0.0.1:8080/eventbus");

       eb.onopen = function() {

          eb.registerHandler("events-feed", function(error, message) {
              console.log("Message: " + message.body);
          });

          eb.registerHandler("receiver", function(error, message) {
             console.log('Message: ' + message.body);
          });

          eb.publish("events-feed", "Test", function (error, message) {
              console.log(JSON.parse(message.body));
          });
      }

    }



}

The connection to the backend will be established and I receive message via registerHandler method. But when I move the code in a function like this:

private eb : any;

initializeEventBus() {


 this.eb = new EventBus("http://127.0.0.1:8080/eventbus");

       this.eb.onopen = function() {

          this.eb.registerHandler("events-feed", function(error, message) {
              console.log("Message: " + message.body);
          });

          this.eb.registerHandler("receiver", function(error, message) {
             console.log('Message: ' + message.body);
          });

          this.eb.publish("events-feed", "Test", function (error, message) {
              console.log(JSON.parse(message.body));
          });
      }

    }

}

it goes wrong and throws the following error:

core.js:14597 ERROR TypeError: Cannot read property 'registerHandler' of undefined
    at EventBus.DeviceService.eb.onopen (device.service.ts:28)
    at w.self.sockJSConn.onopen (vertx-eventbus.js:121)
    at w.r.dispatchEvent (eventtarget.js:51)
    at w._open (main.js:320)
    at w._transportMessage (main.js:253)
    at u.i.emit (emitter.js:50)
    at WebSocket.ws.onmessage [as __zone_symbol__ON_PROPERTYmessage] (websocket.js:35)
    at WebSocket.wrapFn (zone.js:1332)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:16147)

Do you hav any idea what I did wrong?

Greets


Solution

  • Since you are using this keyword, it is not getting binded. To make it work you need to use arrow function like below.

    this.eb.onopen = () => {
    
              this.eb.registerHandler("events-feed", (error, message) => {
                  console.log("Message: " + message.body);
              });
    
              this.eb.registerHandler("receiver",  (error, message) => {
                 console.log('Message: ' + message.body);
              });
    
              this.eb.publish("events-feed", "Test",  (error, message) => {
                  console.log(JSON.parse(message.body));
              });
          }
    

    Hope this helps.