2017-03-29 3 views
0

Ich habe einen Abschnitt in meiner Anwendung, wo ich eine Kommunikation zwischen dem Server und dem Client einrichten, die für immer Schleife, bis der Benutzer diesen Bildschirm verlässt. Wenn der Benutzer den Bildschirm verlässt, stelle ich dieses Problem mit $rootScope.$on('$stateChangeStart') fest und sende einen $ http-Aufruf, um den Prozess auf dem Server zu stoppen.AngularJS: Server-Aufruf auf Tab/Browser schließen

Ich möchte das gleiche $ http ausführen, wenn der Benutzer den aktuellen Tab oder Browser schließt, aber ich kann das nicht tun.

Zunächst einmal ist dies die Service-Funktion, die die $ HTTP-Aufruf macht:

function cancelCommProcess(webId, commActionId) { 
      return $http.get(BASE_URL + '/rest/comm/kill-current-com-process/' + webId + '/' + commActionId) 
      .then(
        function(response) { 
         return response; 
        } 
      ); 
     } 

Wie gesagt, wenn ich diese Funktion im $rootScope.$on('$stateChangeStart') nennen oder einen anderen Punkt, es funktioniert.

Jetzt habe ich den folgenden Code, um diese Funktion aufzurufen, wenn Tab/Browser geschlossen wird:

$window.onbeforeunload = function (evt) { 
      if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
       CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
        .then(
          function() { 
           console.log('HELLO'); 
          } 
        ); 
      } 
     } 

diese Weise wird die $ http Aufruf erreichen den Server nicht, aber wenn ich einfach die nächste Änderung vorgenommen hat, dann funktioniert es:

$window.onbeforeunload = function (evt) { 
      if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
       CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
        .then(
          function() { 
           myTest(); 
          } 
        ); 
      } 
     } 

     function myTest() { 
      console.log('HELLO'); 
     } 

Noch mehr, vorherige Methode funktioniert in Chrome und Firefox, aber nicht in Edge. Aber es funktioniert (ich meine, erreicht die $ HTTP-Aufruf den Server), wenn ich es wie folgt tun:

$window.onbeforeunload = function (evt) { 
    if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
     CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
      .then(
        function() { 
         myTest(); 
         //console.log('HELLO'); 
        } 
      ); 
    } 
    return ""; 
} 

function myTest() { 
    console.log('HELLO'); 
} 

Natürlich bekomme ich die Bestätigungsnachricht zu hinterlassen oder die Seite zu bleiben, aber ich weiß nicht, warum Der Anruf erreicht den Server nur, indem er diese Nachricht anzeigt.

Ich verstehe nicht wirklich, wie das funktioniert, also schätze ich Ihre Hilfe. Die Idee des $ http-Aufrufs besteht darin, dem Server mitzuteilen, dass er den aktuellen Kommunikationsprozess unterbrechen soll, aber ich finde, dass diese Methode nicht wahrheitsgemäß ist.

Würden Sie mir helfen, herauszufinden, was der beste Ansatz dafür ist?

Vielen Dank.

Antwort

0

Ich empfehle Ihnen, socket.io verwenden, die Verbindung zwischen Client und Server lebendig zu halten und nicht Server in Schleife.

Dieses Ereignis ausgelöst, wenn Controller destory können Sie es

$scope.$on('$destroy', function() { 
    console.log("destory"); 
}); 
+0

verwenden Dies wird nicht ausgelöst, wenn Tab/Browser geschlossen wird. – rocotocloc

Verwandte Themen