首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从promise中返回值

从promise中返回值
EN

Stack Overflow用户
提问于 2016-11-09 23:46:49
回答 2查看 2K关注 0票数 0

我有一个注入服务的服务。子服务连接到facebook api,并假定将用户的登录状态返回给父服务。我面临的问题是,这个fb api调用使用了promise,并且我试图根据子服务函数调用的值在父服务中执行一些逻辑。这样做的正确方法是什么?

这是我尝试过的:

facebook.service.ts

注意,下面的代码成功地连接到facebook api并输出"connected“,因为它应该**

代码语言:javascript
运行
复制
checkLoginStatus() {
        this.FB.getLoginStatus( (response) => {
            console.log(response.status); //outputs "connected"
        });

}

但是,我试图将promise响应中包含的值返回给父服务,因此我修改了代码,如下所示……并得到错误:

代码语言:javascript
运行
复制
Uncaught (in promise): TypeError: Cannot read property 'getLoginStatus' of undefined

facebook.service.ts

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
constructor(@Inject(FacebookService) private fb:FacebookService) {
    this.authenticateFacebook();
}

authenticateFacebook() {
    this.fb.checkLoginStatus().then( (response) => {
        console.log(response); //should output connected
    });
}
EN

回答 2

Stack Overflow用户

发布于 2016-11-10 01:14:12

在调用服务时,this.FB仍然是未定义的,如错误所示。这是因为初始化本身是异步的: facebook()加载库,只有当它被加载时,this.FB才被初始化。在使用this.FB之前,您只需要等待初始化完成。不过,修复方法相对简单:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-11-10 00:04:37

只需将它包装在您自己的promise中,您就可以返回它,并且在resolve值中您可以指定一个返回值。

代码语言:javascript
运行
复制
public authenticateFacebook(): Promise<any> {

        return new Promise((resolve, reject) => {
           this.fb.checkLoginStatus().then( response => {
                console.log(response); //should output connected
                resolve(response);
            });
        });

    }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40510889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档