gpt4 book ai didi

javascript - Angular promise .then() 重复?

转载 作者:行者123 更新时间:2023-12-02 13:55:43 24 4
gpt4 key购买 nike

我有一个函数,它返回一个 promise ,如果用户当前登录,则该 promise 得到解决,或者在用户登录后等待解决。所以你可以这样做...

myService.waitForLogin().then(function(){
// Subscribe to pusher.com events
});

然后,当用户注销时,我使用类似的调用来取消订阅事件。

问题是我想在每次用户登录时运行我的 .then() 代码,所以这个过程是......

  • 如果用户已登录,则运行代码。

  • 如果没有,请等待他们登录,然后运行代码。

  • 如果他们注销然后再次登录,请再次运行代码。

我最初使用 $rootscope.$on 来监听登录/退出事件,这对于重复发生的事件效果很好,但我需要它基于 promise ,以防用户已经登录。

这是我的代码:

var defer = $q.defer();

if(isLoggedIn()){
defer.resolve();
}

else{

var offLoggedInTrue = $rootScope.$on('loggedin-true', function(){
defer.resolve();
offLoggedInTrue();
});

}

return defer.promise;

最佳答案

您可以通过在服务上存储延迟来使用 Promise 来控制登录状态,然后通过方法 waitForLogin() 返回 Promise。但是,您可以不解决 promise ,而只是通知它,一旦解决了登录 promise ,它就不会再次解决,因此您可以通知并尽可能多次重用它。

注意:这是一个使用 Promise 的解决方案,但是您可能会发现更好的使用事件,我认为它更容易维护。

例如:

angular.module('myApp', [])
.service('LoginStatusService', function($q) {

// store a deferred to represent the login resolution state
var loginDeferred = $q.defer();

// the getter method to yout login promise
this.waitForLogin = function() {
return loginDeferred.promise;
};

// an example login method from where you could notify the login promise
this.login = function(login, password) {
/// do async login things and then
loginDeferred.notify();
};

// when the deferred may need to got reseted
this.logoff = function(login, password) {
/// do logoff things and then
// loginPromise = $q.defer();
};
})

然后在您的 Controller 或任何您想要的提供商上,您可以注入(inject)服务并像这样使用它:

  .controller('MyController', function(LoginStatusService) {

LoginStatusService.waitForLogin().then(null, null, function () {
// do your subscribe stuff here
});
});

关于javascript - Angular promise .then() 重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com