好的,我对AngularFire2
和Angular2
一般都很陌生,我正在学习AngularFire2
提供的身份验证方法。
到目前为止,我已使用Facebook
成功实施了登录,我的代码目前位于service
。
所以代码很简单(可能看起来很恶心),我通过Facebook
登录检索用户访问令牌,他们的facebookId,拨打Facebook图表并检索名字,姓氏,性别,电子邮件等然后将这些数据保存在Firebase
中这是我执行上述操作的代码:
loginWithFacebook(): FirebaseListObservable<string> {
return FirebaseListObservable.create(obs => {
this.af.auth.login({
provider: AuthProviders.Facebook,
method: AuthMethods.Popup,
scope: ['public_profile']
}).then((authState: any) => {
let userRef = this.af.database.object('/users/' + authState.uid); // get user profile
userRef.subscribe(user => {
let url = `https://graph.facebook.com/v2.8/${user.facebookId}?fields=first_name,last_name,gender,email&access_token=${user.accessToken}`;
this.http.get(url).subscribe(response => {
let result = response.json()
userRef.update({
first_name: result.first_name,
last_name: result.last_name,
gender: result.gender,
email_address: result.email,
facebookId: user.facebookId
})
})
})
obs.next(userRef);
}).catch(err => {
obs.throw(err)
});
});
我从我的login.component
拨打电话,如下所示:
loginFacebook() {
this.loginSubscription = this.service.loginWithFacebook().subscribe(data => {
console.log('after finish', data);
});
}
问题我想要捕获如果登录facebook失败或通过我尝试在Service方法中填充Observable
,但是当我在console.log&#39;完成后#&#39; 39;,数据我看到以下内容:
有人可以说明我如何从这种方法中返回真/假吗?如果有人能够看到更清洁的方式,我将非常感激。
答案 0 :(得分:0)
现在无法测试,你可以这样做:
loginWithFacebook(): Observable<boolean> {
return this.af.auth.login({
provider: AuthProviders.Facebook,
method: AuthMethods.Popup,
scope: ['public_profile']
})
.map((authState: any) => {
if (!authState) return false;
let userRef = this.af.database.object('/users/' + authState.uid); // get user profile
userRef.subscribe(user => {
let url = `https://graph.facebook.com/v2.8/${user.facebookId}?fields=first_name,last_name,gender,email&access_token=${user.accessToken}`;
this.http.get(url).subscribe(response => {
let result = response.json();
userRef.update({
first_name: result.first_name,
last_name: result.last_name,
gender: result.gender,
email_address: result.email,
facebookId: user.facebookId
})
})
})
return true;
}).catch(err => {
return Observable.of(false);
});
}
loginFacebook() {
this.loginSubscription = this.service.loginWithFacebook().subscribe(data => {
console.log('after finish', data);
});
}