如何获得下面的函数来返回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
}
答案 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
运算符使上述示例正常工作。
无论如何,你的主要问题是尝试同步使用观察者,目前无法做到这一点。