我有一个注入服务的服务。子服务连接到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
});
}
发布于 2016-11-10 01:14:12
在调用服务时,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);
}
发布于 2016-11-10 00:04:37
只需将它包装在您自己的promise中,您就可以返回它,并且在resolve值中您可以指定一个返回值。
public authenticateFacebook(): Promise<any> {
return new Promise((resolve, reject) => {
this.fb.checkLoginStatus().then( response => {
console.log(response); //should output connected
resolve(response);
});
});
}
https://stackoverflow.com/questions/40510889
复制相似问题