我有一个请求:
// api-service.ts
getUsers() {
return this.http.get(this.BaseUrl + 'users/', httpOptions);
}
我想将结果设置为这样的变量:
// users-component.ts
ngOnInit() {
this.users = this.api.getUsers();
}
当前,我必须执行以下操作:
// users-component.ts
ngOnInit() {
this.api.getUsers().subscribe(res => {
this.users = res;
})
}
我尝试这样的事情:
// api-service.ts
getUsers() {
return this.http.get(this.BaseUrl + 'users/', httpOptions).pipe(
map (res => { return res; })
);
}
但这不起作用。
我只是想将此请求的结果设置为一个变量,而不使用我的变量所在的订阅。
谢谢
答案 0 :(得分:3)
实际上您可能不想这样做,但是让我来解决这个问题。
如果您确实想这样做:请使用Promise
您始终可以使用toPromise()
函数将请求转换为Promise。但是:
角度都是可见的
Angular已将Observable广泛应用于其组件中,因此也应与它们一起使用。这样做可以带来很多好处。 例如,您无需等待客户端检索所请求的数据,而可以执行其他操作。
可观察对象无法像您希望的那样工作
从Observable
返回的httpClient
(或与此相关的任何Observable)不包含您想要获取的值,它代表管道,一旦任何{{ 1}}。
意味着除非订阅,否则此流将不会输出任何数据。
如果您不想像上面那样手动进行订阅,则由于担心内存泄漏和未关闭的订阅,可以使用subscription
角度提供。
该管道为您订阅了一个可观察对象,并将其转换为提供的最新值。
答案 1 :(得分:2)
您可以这样做:
// users-component.ts
async ngOnInit() {
this.user = await this.api.getUsers().toPromise();
}
编辑:
即使我为您的问题建议了toPromise()
的方式,我也不喜欢所有异步等待的东西。观测值与rxjs运算符结合可以使您成为魔术师。学习曲线很高,但确实很有意义。我建议存储可观察对象,并按照@Chund的建议使用异步管道进行订阅。