我有一个注入服务的服务。子服务连接到facebook api,并且假设将用户的登录状态返回给父服务。我面临的问题是这个fb api调用使用了一个promise,我试图根据子服务函数调用的值在父服务中执行一些逻辑。这样做的正确方法是什么?
这就是我的尝试:
facebook.service.ts
注意,下面的代码成功连接到facebook api并输出“connected”,因为它应该**
checkLoginStatus() {
this.FB.getLoginStatus( (response) => {
console.log(response.status); //outputs "connected"
});
}
但是,我试图将promise的响应中包含的值返回给父服务,所以我修改了代码如下...并得到错误:
Uncaught (in promise): TypeError: Cannot read property 'getLoginStatus' of undefined
facebook.service.ts
FB:any;
constructor() {
facebook().then((FB) => {
// Initialize SDK
FB.init({
appId : '1111111111111111',
cookie : true, // enable cookies to allow the server to access
// the session
xfbml : true, // parse social plugins on this page
version : 'v2.8' // use graph api version 2.5
});
this.FB = FB;
});
}
checkLoginStatus() {
this.FB.getLoginStatus( (response) => {
return response.status; //"connected"
});
}
home.service.ts
constructor(@Inject(FacebookService) private fb:FacebookService) {
this.authenticateFacebook();
}
authenticateFacebook() {
this.fb.checkLoginStatus().then( (response) => {
console.log(response); //should output connected
});
}
答案 0 :(得分:-1)
在您调用服务时,this.FB
仍未定义,如错误所示。这是因为初始化本身是异步的:facebook()加载库,只有在加载时,this.FB
才会被初始化。在使用this.FB
之前,您只需要等待此初始化。修复程序相对简单:
private fbPromise: Promise<any>;
constructor() {
this.fbPromise = facebook().then((FB) => {
// Initialize SDK
FB.init({
appId : '1111111111111111',
cookie : true, // enable cookies to allow the server to access
// the session
xfbml : true, // parse social plugins on this page
version : 'v2.8' // use graph api version 2.5
});
return FB;
});
}
private authenticateFacebook(FB): Promise<any> {
return new Promise((resolve, reject) => {
FB.getLoginStatus(response => resolve(response));
});
}
checkLoginStatus(): Promise<string> {
return this.fbPromise
.then(FB => this.authenticateFacebook(FB))
.then(response => response.status);
}
答案 1 :(得分:-2)
只需将其包装在您可以返回的自己的承诺中,并在解析值中指定返回值。
public authenticateFacebook(): Promise<any> {
return new Promise((resolve, reject) => {
this.fb.checkLoginStatus().then( response => {
console.log(response); //should output connected
resolve(response);
});
});
}