2015-08-25 40 views
1

我在這裏遇到問題。我需要在關閉或刷新時執行註銷,這意味着當客戶離開網頁或關閉瀏覽器/選項卡時。我創建了一個添加到我的表單中的指令,它應該調用註銷功能(其中包括REST調用我們的後端,這將觸發Siteminder註銷)。 REST調用有時會執行,但主要被取消。 console.log消息幾乎從不出現。AngularJS註銷關閉或刷新 - REST服務調用取消

.directive('gcdmAutomaticLogoutOnClose', function($rootScope, 
      $window, MyLoginService){ 
return { 
    restrict: 'A', 
    scope: true, 
    controller: function($element){ 
    $window.onbeforeunload = function(){ 
     return MyLoginService.logout().then(function(){ 
     console.log("Logout complete"); 
     return null; 
     }); 

    }} 

    } 

}); 

任何想法?

+0

但是你假設onbeforeunload將等待註銷來得到解決?一旦解決了,爲什麼還要等待回調結束? –

+0

這可能是原因。但是,任何想法如何做到這一點? –

+0

我不確定onbeforeunload是否等待承諾。但如果是這樣,只需創建另一個承諾,並在註銷許諾的成功回調中解決它;並使onbeforeunload等待第二個承諾。 –

回答

0

如果要確保它在頁面卸載之前執行,您的註銷服務應該同步運行(不返回承諾)。

角的$ HTTP服務異步設計運行,但here's a link showing how to make a synchronous service:

+0

謝謝。我嘗試調整鏈接中的代碼,但它仍然不會阻止...我的控制器現在: var task1 = $ q.defer(); task1.promise.then(函數(值){「console.log(」Start complete「); },function(value){ console.log(」failed to logout「) }); (); LoginTimeoutService.logout()。then(function(){ console.log(「Logout complete」); task1.resolve(); }); $ q.all([task1.promise]),然後( 函數(){ 的console.log( 「所有完整」);} )。 –