Angular2:如何获取布尔函数以返回从subscribe函数派生的变量?

时间:2016-11-01 13:45:29

标签: angular typescript

如何获得下面的函数来返回this.loggedIn变量?

    autho(): boolean{

   this.http.get("http://localhost:1337/session").map(res => res.json()).subscribe(
         data => this.loggedIn = data.authenticated,
         err => console.log(err),
         () => console.log('autho API response ', this.loggedIn)


         )

      return this.loggedIn; // I am getting undefined
  }

1 个答案:

答案 0 :(得分:0)

假设 http 类的成员是angular2 http服务的一个实例,那么您的问题就是基本的异步问题。

("http://localhost:1337/session")返回一个可观察的流,该流是一个对象,它提供绑定处理函数解析的回调的能力。此解决方案是异步的,这意味着您不能像您所做的那样直接返回loggedIn。在此步骤中,尚未调用订阅回调。

您有很多方法可以实现您的目标,但一定要了解代码的异步状态。 我建议你将你的observable转换成一个可以链接并返回它的promise。

@Injectable()
class FooBar {

    ...

    constructor(private http:Http) {}

    ...

    authO():Promise {
        return this.http.get('http://localhost:1337/session')
        .toPromise()
        .then((response:Response) => response.json())
        .then((data) => {
            return this.loggedIn = data.authenticated;
        });
    }




}

//usage 
@Component({...})
class FooBarComponent {

    constructor(private foobarService:FooBar) {

    }

    auth() {
        this.foobarService.auth0()
            .then((loogedIn) => {
                // do some stuff
            })
            .catch((err) => {
                console.error(err);
            });
    }

}

你可以保留observable并使用subscribe模式,但在我看来,observable / observer模式在多次触发事件时非常有用。 http进程只能触发一次订阅处理程序而无法链接,因此在这种情况下承诺会更好。

请务必要求rxjs中的toPromise运算符使上述示例正常工作。

无论如何,你的主要问题是尝试同步使用观察者,目前无法做到这一点。