2017-09-06 10 views
1

Dans mon projet Angular 2, j'utilise le ng2-stomp-service pour établir une connexion socket au serveur.S'assurer que la connexion du socket STOMP est établie avant de s'abonner

La plupart du temps, il fonctionne très bien, mais parfois je reçois cette erreur lorsque vous essayez de vous abonner à la prise, en disant que ma connexion n'a pas encore été établie:

Error: Uncaught (in promise): Error: InvalidStateError: The connection has not been established yet Error: InvalidStateError: The connection has not been established yet 
    at SockJS.send (main.js:158) 
    at Client._transmit (stomp.js:159) 
    at Client.subscribe (stomp.js:379) 
    at StompService.subscribe (stomp.service.ts:132) 
    at slide-manager.service.ts:129 
    at ZoneDelegate.invoke (zone.js:391) 
    at Object.onInvoke (core.es5.js:3933) 
    at ZoneDelegate.invoke (zone.js:390) 
    at Zone.run (zone.js:141) 
    at zone.js:818 
    at SockJS.send (main.js:158) 
    at Client._transmit (stomp.js:159) 
    at Client.subscribe (stomp.js:379) 
    at StompService.subscribe (stomp.service.ts:132) 
    at slide-manager.service.ts:129 
    at ZoneDelegate.invoke (zone.js:391) 
    at Object.onInvoke (core.es5.js:3933) 
    at ZoneDelegate.invoke (zone.js:390) 
    at Zone.run (zone.js:141) 
    at zone.js:818 
    at resolvePromise (zone.js:770) 
    at zone.js:821 
    at ZoneDelegate.invokeTask (zone.js:424) 
    at Object.onInvokeTask (core.es5.js:3924) 
    at ZoneDelegate.invokeTask (zone.js:423) 
    at Zone.runTask (zone.js:191) 
    at drainMicroTaskQueue (zone.js:584) 
    at WebSocket.ZoneTask.invoke (zone.js:490) 

Le morceau de cette trace de pile appartient à moi est le slide-manager.service.ts: 129. Ce code est à la ligne de stomp.subscribe de ce code:

this.socketConfig = { 
     host: 'http://' + getHost() + '/app-ws', 
     debug: true, 
     queue: {'init': false} 
    }; 

this.stomp.configure(this.socketConfig); 
this.stomp.startConnect().then((frame) => { 
this.stomp.done('init'); 
this.connected = true; 
this.spectraSubscription = this.stomp.subscribe('/topic/spectra', (spectra) => { 
    if (spectra && (!this.theChart || hostElement.childElementCount === 0) && !this.refreshFlag) { 
     this.makeChart(spectra.points, hostElement); 
     this.refreshFlag = true; 
    } else if (spectra && (this.theChart || hostElement.childElementCount > 0) || this.refreshFlag) { 
     this.theChart.collectionView.sourceCollection = spectra.points; 
     this.theChart.collectionView.refresh(); 
    } 
    }); 

Comment puis-je assurer que la connexion est bien établie avant qu'il tente d'exécuter le .subscribe()? Je pensais que le placer dans le bloc .then() ferait l'affaire, puisque cela devrait seulement être exécuté après que la promesse de la connexion ait été résolue, mais apparemment elle se déclenche même quand aucune connexion n'existe (selon l'erreur).

Ou y a-t-il d'autres choses ici qui me manquent?

Répondre

1

j'ai pu résoudre ce problème en vérifiant intégré la propriété « statut » du client Stomp:

if (this.stomp.status === 'CONNECTED') { 
    // do stuff that requires a connection, like establish subscriptions 
}