2017-03-08 72 views
0

大家好我身边有搜索小时,想尽一切诸如此类BehaviorSubject or ReplaySubeEvents但unsuccessfull ..角2发送回调服务组件

问题

我有一个个人主页,其中一个按钮loginFb()其中调用我的users.services。这项服务FacebookAPI调用数据,并将它们发送到数据库。现在它会很酷发回一个“回调”到我的组件与用户对象:)

因为当我(点击)在登录时,我看到Firebase中的新用户,但我的页面没有“刷新”,我想这是因为我的异步太晚了..?

这里是我的profile.ts(ProfilePage)

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"); 
    }); 
    } 
+0

我不是'Observable'专家,但我认为这个问题来自于'registerUserFb'函数在您调用'getUserFacebook'时尚未完成的事实。我认为你称之为“registerUserFb”,并且在承诺完成之前,你调用'getUserFacebook',这样你就什么也没有(因为承诺没有完成),当它完成时,你不会在你的'observable'上发射任何东西,因此,您的订户不知道用户已更改。我想你应该在你的服务中引用你的'observable',并在'if'中检查用户是否连接,调用其''emit''函数。 – ssougnez

回答

2

您发送多发异步请求,你必须等到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(); 
      } 

     }); 
     }); 
    }); 
} 
+0

非常感谢你的帮助!但我不知道为什么,但是它首先调用'getUserFacebookId()',这真的很奇怪,我会尽力在所有地方都承诺。 – luiswill

+0

好吧,我尝试了一些小东西,它的工作!非常感谢你 ! :) – luiswill

+0

欢迎兄弟:)。 –

0

这里是s青梅伪码,应该如何看待使用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指出,在两个异步调用之间的竞争。