[英]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()
返回的observable有關。 盡管不清楚問題的代碼,但該函數返回的this.usersList
似乎是所有用戶的AngularFire2 list
。
每當數據庫更改時,AngularFire2 list
和object
可觀察object
都會發出數據,因此在_updateLogIn
設置用戶數據很可能會導致發出另一個用戶列表, _updateLogIn
。
要解決該問題,可以使用第first
運算符:
import 'rxjs/add/operator/first';
this._isUsers().first().subscribe(...)
但是,尚不清楚為什么首先需要訂閱該可觀察項。 您可能要考慮重構問題中的代碼,因為它看起來過於復雜。
通常最好避免盡可能多的subscribe
呼叫。 您可能需要閱讀RxJS:不要退訂 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.