2016-04-21 2 views
0

Wie ich verstehe, wenn eine Anfrage an einen Event-Emitter auf dem Server ankommt, wird diese Anfrage nie geschlossen und Sie müssen immer nur res.write() jedes Mal, wenn Sie eine Nachricht senden möchten. Gibt es jedoch eine Möglichkeit, benachrichtigt zu werden, wenn der Client, der diese Anfrage ausgeführt hat, verlassen wurde? Gibt es eine Eigenschaft auf dem Objekt request?Gibt es eine Möglichkeit, benachrichtigt zu werden, wenn sich ein Client vom Server gesendete Ereignisse abbestellt hat?

nehme ich die folgende Route

app.get('/event',function(req,res){ 

//set response headers 

//how do I check if req object is still active to send a message and perform other actions? 

}) 
+0

Aus Interesse, warum möchten Sie das wissen? – baynezy

+0

Nun, ich habe einen Zähler, der erhöht wird, wenn ein Benutzer sie abonniert und möchte es verringern, wenn sie sich abmelden ... das ist alles –

Antwort

0

Die grundlegende Abfolge der Ereignisse sollten in einem anderen Rahmen ähnlich sein, aber dieses Beispiel ist Grails 3.3 haben.

Zuerst Endpunkte zum Abonnieren einrichten und die Verbindung schließen.

def index() { 
    // handler for GET /api/subscribe 

    rx.stream { Observer observer -> 

     // This is the Grails event bus. background tasks, 
     // services and other controllers can post these 
     // events, CLIENT_HANGUP, SEND_MSG, which are 
     // just string constants. 

     eventBus.subscribe(CLIENT_HANGUP) {String msg -> 

      // Code to handle when the grails event bus 
      // posts CLIENT_HANGUP 
      // Do any side effects here, like update your counter 
      // Close the SSE connection 

      observer.onCompleted() 
      return 
     } 

     eventBus.subscribe(SEND_MSG) {String msg -> 

      // Send a Server Sent Event 

      observer.onNext(rx.respond(msg)) 
     } 
    } 
} 



def disconnecting() 
{ 
    // handler for GET /api/disconnect 
    // Post the CLIENT_HANGUP event to the Grails event bus 

    notify(CLIENT_HANGUP, 'disconnect') 
} 

nun in dem Client, müssen Sie GET /api/disconnect, wenn Ihr Anwendungsfall erfordert es zu arrangieren. Angenommen, Sie möchten bemerken, wenn jemand von Ihrer Seite weg navigiert, können Sie eine Funktion unter window.onbeforeunload registrieren. In diesem Beispiel wird Vue.js und Axios verwendet.

window.onbeforeunload = function (e) { 
    e.preventDefault() 
    Vue.$http({ 
     method: 'get', 
     url: 'http://localhost:8080/api/disconnect' 
    }) 
     .then((response) => { console.log(response) }) 
     .catch(({error}) => { console.log(error) }) 
    } 

Im Fall von Servlet-Stacks wie Grails, fand ich, dass ich dies auch tun musste, wenn ich kein Housekeeping meiner eigenen zu tun hatte, wenn der Browser wegging. Ohne sie verursachten Seitenladevorgänge am hinteren Ende IOExceptions.

Verwandte Themen