如何停止 AngularFire2 功能?
How to stop AngularFire2 function?
我正在使用 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()
返回的可观察对象有关。尽管从问题的代码中不清楚,但该函数返回的 this.usersList
似乎是所有用户的 AngularFire2 list
。
AngularFire2 list
和 object
可观察对象会在数据库发生变化时发出数据,因此您在 _updateLogIn
中设置用户数据可能会导致发出另一个用户列表,等等.
要解决这个问题,您可以使用 first
运算符:
import 'rxjs/add/operator/first';
this._isUsers().first().subscribe(...)
但是,不清楚为什么您首先需要订阅该 observable。您可能需要考虑重构问题中的代码,因为它看起来过于复杂。
通常最好避免尽可能多的 subscribe
调用。您可能想阅读 RxJS: Don’t Unsubscribe.
我正在使用 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()
返回的可观察对象有关。尽管从问题的代码中不清楚,但该函数返回的 this.usersList
似乎是所有用户的 AngularFire2 list
。
AngularFire2 list
和 object
可观察对象会在数据库发生变化时发出数据,因此您在 _updateLogIn
中设置用户数据可能会导致发出另一个用户列表,等等.
要解决这个问题,您可以使用 first
运算符:
import 'rxjs/add/operator/first';
this._isUsers().first().subscribe(...)
但是,不清楚为什么您首先需要订阅该 observable。您可能需要考虑重构问题中的代码,因为它看起来过于复杂。
通常最好避免尽可能多的 subscribe
调用。您可能想阅读 RxJS: Don’t Unsubscribe.