0

我想将Facebook登录集成到Angular 2应用中。 Facebook SDK是异步加载的,我想将这个异步调用包装在Observable中。将Facebook登录换成RxJS Angular2应用中的Observable

fbInit() { 
var deferred = Observable.create(observer => { 
    this._window.instance.fbAsyncInit =() => { 
    this._window.instance.FB.init({ 
     appId  : 'xxxxxxxxxxxxxxx', 
     xfbml  : true, 
     version : 'v2.8' 
    }); 
    this._window.instance.FB.AppEvents.logPageView(); 
    console.log("fbInit"); 
    observer.next(); 
    }; 

    (function(d, s, id){ 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) {return;} 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
    }(document, 'script', 'facebook-jssdk')); 
}); 
return deferred; 
} 

(this._window.instance返回窗口对象)

一旦调用成功,我想通过FB对象来获取用户的登录状态,即把对全球窗口对象。我使用RxJs'bindCallback函数将普通回调包装到Observable中。

getFbStatus() { 
    console.log("getFbStatus"); 
    return Observable.bindCallback(this._window.instance.FB.getLoginStatus); 
} 

现在我要连续运行异步查询此起彼伏:

1)初始化FB SDK,并把FB全球window对象
2)检查登录状态
3)不要取决于登录状态的东西

使用承诺此任务将非常简单。经过一番研究,我发现flatMapconcat可以解决我的问题。两次尝试都没有成功。这是我已经试过:

const initFb$ = this.fbInit(); 
const getFbStatus$ = this.getFbStatus(); 
const combined$ = Observable.concat(initFb$, getFbStatus$); 

combined$.subscribe(
    res => console.log(res), 
    err => console.error(err) 
) 

运行此,出现以下错误:

TypeError: Cannot read property 'getLoginStatus' of undefined 

似乎getFbStatus被调用时,Facebook的SDK被加载之前。

我在这里错过了什么? 任何帮助非常感谢。

回答