【发布时间】:2016-11-22 00:24:56
【问题描述】:
我有一个函数,它返回一个承诺,如果用户当前登录,该承诺将被解决,或者在用户登录后等待解决。所以你可以这样做......
myService.waitForLogin().then(function(){
// Subscribe to pusher.com events
});
然后,当用户注销时,我使用类似的调用取消订阅事件。
问题是我想在每次用户登录时运行我的 .then() 代码,所以过程是....
如果用户已登录,则运行代码。
如果没有,请等他们登录后再运行代码。
如果他们注销然后重新登录,请再次运行代码。
我最初使用 $rootscope.$on 来监听登录/退出事件,这对于重复发生的事件非常有效,但我需要它是基于用户已经登录的情况下的承诺。
这是我的代码:
var defer = $q.defer();
if(isLoggedIn()){
defer.resolve();
}
else{
var offLoggedInTrue = $rootScope.$on('loggedin-true', function(){
defer.resolve();
offLoggedInTrue();
});
}
return defer.promise;
【问题讨论】:
-
Promise 只能得到一次解决......根据定义。也许您应该尝试使用其他异步系统,例如
Rx.Observable(尽管这是一个完全不同的 API) -
如果用户已经登录,你也可以手动触发'loggedin-true'事件。
-
我不确定 rxjs 是否可行。基本上,是的,这是可能的,但我们都知道,
window.setTimeout有一个最大限制。还要记住移动浏览器问题,由于安全和 GUI 冻结原因,没有实现window.setTimeout。但是你可以适当地在一个间隔内发出事件,检查用户是否登录。或者更好:改变你的概念。还有许多其他方法可以完成这项常见任务。也许您可以使用 REST 请求到您的后端定期检索用户状态。
标签: javascript angularjs promise angular-promise