从promise中返回一个值

时间:2016-11-09 15:46:49

标签: angular typescript promise

我有一个注入服务的服务。子服务连接到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
    });
}

2 个答案:

答案 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);
            });
        });

    }