【问题标题】:How to stop AngularFire2 function?如何停止 AngularFire2 功能?
【发布时间】:2017-01-15 07:31:29
【问题描述】:

我正在使用 AngularFire2 身份验证。一切正常。现在我想要实现的是,检查用户是否已经在用户列表中,然后在下次单击 facebook 登录按钮时更新 lastLogin 。

否则创建一个新用户。

这很好用。但是我无法在更新数据库后停止 updateLogin() / _addUser() 函数。

它一直在继续。 (89...)auth.service.ts:98 成功登录!

这里是 updateLogin()

private _updateLogIn(thisurl, data) {
    return thisurl.update({ 
        lastLogIn: firebase.database.ServerValue.TIMESTAMP,
        avatar: data.photoURL
      }).then((success) => {
        console.log("successfully logged in!");
      }); ;
  }

我用如下的 authentication() 函数调用它:

login(provider: string) {
    this.af.auth.login({
      provider: this._getProvider(provider)
    }).then(
        (success) => {
       this.authenticate(success);
   })
   return;
  }

    authenticate(user: any): any {
         if(!user) {
          return {};
        } else {
        let data = user.auth.providerData[0];
        this.api_url = this.af.database.object(`${this.path}/${user.auth.uid}`);
         this._isUsers().subscribe(value => {
           var filtered =  value.filter(function(item) {
                return item.uid === user.auth.uid;
            });
            if(filtered.length > 0){this._updateLogIn(this.api_url, data); return; }
            else{ this._addUser(this.api_url, user, data); return;
               }
          });
         return;
        }
      }

 _isUsers(){
   return this.usersList.map(snapshot => {
         return snapshot;
     });
  }

private _addUser(thisurl, user, data){
    return thisurl.set({
          name: data.displayName,
          username: data.displayName.replace(/ /g,"."),
          avatar: data.photoURL,
          email: data.email,
          provider: data.providerId,
          uid: user.auth.uid,
          lastLogIn: firebase.database.ServerValue.TIMESTAMP
      }).then((success) => {
        console.log("successfully signed up!");
        return;
      }); 
 }

如何将函数执行停止一次? 这基本上破解了我的浏览器标签。

(89...)auth.service.ts:98 成功登录!

【问题讨论】:

  • 你也应该包含_isUsers_addUser的实现。
  • 你那里似乎也没有createUser。请尝试在您的问题中包含minimal reproducible example,或至少包含所有相关代码。

标签: javascript firebase firebase-authentication angularfire2


【解决方案1】:

这个问题很可能与 _isUsers() 返回的 observable 有关。虽然从问题的代码中不清楚,但该函数返回的 this.usersList 似乎很可能是所有用户的 AngularFire2 list

AngularFire2 listobject 可观察对象在数据库更改时发出数据,因此您在 _updateLogIn 中设置用户数据可能会导致发出另一个用户列表,等等。

要解决此问题,您可以使用first 运算符:

import 'rxjs/add/operator/first';

this._isUsers().first().subscribe(...)

但是,尚不清楚为什么您首先需要订阅该 observable。您可能需要考虑重构问题中的代码,因为它似乎过于复杂。

尽量避免调用subscribe 通常是个好主意。您可能想阅读RxJS: Don’t Unsubscribe

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多