2015-08-25 16 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( “所有完整”);} )。 –