这是一个登录函数的示例,它首先从 facebook 获取 accessToken,然后将该令牌发送到第二个服务以获取用户配置文件。
login(): Observable<any> {
let fas: FacebookAuthResponse = {
accessToken: null,
expiresIn: null,
signedRequest: null,
userID: null,
};
let fbResponse: Subject<any> = new Subject();
let userProfile: Subject<any> = new Subject();
this.fb.login().then((response: FacebookLoginResponse) => {
fbResponse.next(response.authResponse);
}), (error: any) => {
console.error(error);
};
fbResponse
.map((far: FacebookAuthResponse) => far.accessToken)
.mergeMap(accessToken => this.processLogin(accessToken))
.subscribe(res => userProfile.next(res));
return userProfile
}
进程登录(令牌){
let headers = new Headers({ 'Authorization': 'Bearer facebook ' + token });
let options = new RequestOptions({ headers: headers });
return this.http.get('http://localhost:8000/user-profile/', options)
}
这里我使用 rxjs Observable 和 rxjs Subject。我会推荐阅读这篇文章:http://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/
fbResponse.next(response.authResponse);
当 this.fb.login 被解析后,在 fbResponse Subject 上调用 next 以进一步处理 fb.login 响应。
.map((far: FacebookAuthResponse) => far.accessToken)
这里的map用于从fbLogin响应中获取accessToken。
接下来发生的事情不是您的问题的一部分,但可能会很有趣。
.mergeMap(accessToken => this.processLogin(accessToken))
.subscribe(res => userProfile.next(res));
mergeMap 让我们订阅请求链中的最后一个调用,并返回该值。
所以当我们订阅这个登录请求时,当所有请求同步完成时,会返回上次调用的用户配置文件。