Angular 2 向组件发送回调服务
Angular 2 Send callback service to component
大家好我已经搜索了几个小时并尝试了所有方法,例如 or with Events 但没有成功..
问题
我有一个个人资料页面,其中有一个按钮 loginFb()
,它调用我的 users.services。该服务使用 FacebookAPI 调用数据并将它们发送到数据库。现在用 user 对象将 "callback" 发回我的组件会很酷 :)
因为当我(单击)登录时,我在 Firebase 中看到了新用户,但我的页面不是 "refreshed",我认为这是因为我的异步为时已晚..?
这是我的profile.ts(个人资料页面)
import { Users } from '../../services/users.service';
export class ProfilePage {
user :any;
isConnected :boolean = false;
constructor(public navCtrl: NavController,
public usersService: Users,
public modalCtrl: ModalController) { }
loginFB(){
this.usersService.registerUserFb();
this.usersService.getUserFacebook().subscribe((userObject) => {
this.user = userObject;
})
}
}
这是我的 users.services.ts
getUserFacebookId(){
Facebook.getLoginStatus().then((response) => {
alert("id in getUSERFACEBOOKID = " + JSON.stringify(response.authResponse.userID));
return response.authResponse.userID;
});
}
getUserFacebook(){
return this.af.database.object('users/' + this.getUserFacebookId());
}
registerUserFb(){
Facebook.login(['email']).then((response) => {
Facebook.getLoginStatus().then((response) => {
if(response.status == 'connected'){
this.checkIfUserExists(response.authResponse.userID);
}
});
});
}
checkIfUserExists(uid) {
let user = this.af.database.object('users/' + uid, { preserveSnapshot: true });
user.subscribe(snapshot => {
if(!snapshot.exists()) {
this.saveInDatabase(uid);
}
});
}
saveInDatabase(uid){
Facebook.api('/' + uid +
'?fields=id, name, ...])
.then((data) => {
var newUser = {
//data saving
};
this.af.database.object('users/' + uid).set(newUser);
this.showToast("User successfully registered");
});
}
您正在发送多个异步请求,您必须等到 registerUserFb
解决后再调用 getUserFacebook
:
//ProfilePage
loginFB(){
this.usersService
.registerUserFb()
.then(()=>{
this.usersService.getUserFacebook().subscribe((userObject) => {
this.user = userObject;
});
});
}
//users.services.ts
registerUserFb(){
return new Promise(resolve => {
Facebook.login(['email']).then((response) => {
Facebook.getLoginStatus().then((response) => {
if(response.status == 'connected'){
this.checkIfUserExists(response.authResponse.userID);
resolve();
}
});
});
});
}
下面是一些使用 RxJs 的伪代码:
registerUserFb():Observable<any>{
return Facebook.login(['email']).flatMap(() => this.getLoginStatus());
}
getLoginStatus():Observable<any>{
return Facebook.getLoginStatus();
}
loginFb(){
this.registerUserFb().flatMap(()=>this.usersService.getUserFacebook()).subscribe((userObject=>{
}))
}
正如@ssougnez 所指出的,两个异步调用之间存在竞争。
大家好我已经搜索了几个小时并尝试了所有方法,例如
问题
我有一个个人资料页面,其中有一个按钮 loginFb()
,它调用我的 users.services。该服务使用 FacebookAPI 调用数据并将它们发送到数据库。现在用 user 对象将 "callback" 发回我的组件会很酷 :)
因为当我(单击)登录时,我在 Firebase 中看到了新用户,但我的页面不是 "refreshed",我认为这是因为我的异步为时已晚..?
这是我的profile.ts(个人资料页面)
import { Users } from '../../services/users.service';
export class ProfilePage {
user :any;
isConnected :boolean = false;
constructor(public navCtrl: NavController,
public usersService: Users,
public modalCtrl: ModalController) { }
loginFB(){
this.usersService.registerUserFb();
this.usersService.getUserFacebook().subscribe((userObject) => {
this.user = userObject;
})
}
}
这是我的 users.services.ts
getUserFacebookId(){
Facebook.getLoginStatus().then((response) => {
alert("id in getUSERFACEBOOKID = " + JSON.stringify(response.authResponse.userID));
return response.authResponse.userID;
});
}
getUserFacebook(){
return this.af.database.object('users/' + this.getUserFacebookId());
}
registerUserFb(){
Facebook.login(['email']).then((response) => {
Facebook.getLoginStatus().then((response) => {
if(response.status == 'connected'){
this.checkIfUserExists(response.authResponse.userID);
}
});
});
}
checkIfUserExists(uid) {
let user = this.af.database.object('users/' + uid, { preserveSnapshot: true });
user.subscribe(snapshot => {
if(!snapshot.exists()) {
this.saveInDatabase(uid);
}
});
}
saveInDatabase(uid){
Facebook.api('/' + uid +
'?fields=id, name, ...])
.then((data) => {
var newUser = {
//data saving
};
this.af.database.object('users/' + uid).set(newUser);
this.showToast("User successfully registered");
});
}
您正在发送多个异步请求,您必须等到 registerUserFb
解决后再调用 getUserFacebook
:
//ProfilePage
loginFB(){
this.usersService
.registerUserFb()
.then(()=>{
this.usersService.getUserFacebook().subscribe((userObject) => {
this.user = userObject;
});
});
}
//users.services.ts
registerUserFb(){
return new Promise(resolve => {
Facebook.login(['email']).then((response) => {
Facebook.getLoginStatus().then((response) => {
if(response.status == 'connected'){
this.checkIfUserExists(response.authResponse.userID);
resolve();
}
});
});
});
}
下面是一些使用 RxJs 的伪代码:
registerUserFb():Observable<any>{
return Facebook.login(['email']).flatMap(() => this.getLoginStatus());
}
getLoginStatus():Observable<any>{
return Facebook.getLoginStatus();
}
loginFb(){
this.registerUserFb().flatMap(()=>this.usersService.getUserFacebook()).subscribe((userObject=>{
}))
}
正如@ssougnez 所指出的,两个异步调用之间存在竞争。