我想将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)不要取决于登录状态的东西
使用承诺此任务将非常简单。经过一番研究,我发现flatMap
或concat
可以解决我的问题。两次尝试都没有成功。这是我已经试过:
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被加载之前。
我在这里错过了什么? 任何帮助非常感谢。