vir*_*sha 4 reactive-programming rxjs typescript angular
我想从Observable获取字符串值并将函数中的值返回给调用函数.
例如:我有一系列的键,并希望逐个获取所有键的值(字符串),并显示具有菜单栏的html组件.
这是ts文件:
public data = [ { 'key': 1, 'value' : this.getValue(1)},
{ 'key': 2, 'value' : this.getValue(2)},
...
];
private getValue(key: number): string {
return this.keyService.find(key).subscribe(response => {
return response;
});
}
Run Code Online (Sandbox Code Playgroud)
...
public find(key:number): Observable<any> {
return this.http.get(`/api/keys/${key}`).map(res => res.json() || {});
}
...
Run Code Online (Sandbox Code Playgroud)
我想显示html组件中的所有值.但是在key-list.component.ts中获取可观察到类型字符串的错误.
我如何解决这个订阅方法,并确保getValue应该始终返回字符串,并使其完美无瑕.
其中一个解决方案是:
private getValue(key: number): string {
let result: string;
this.keyService.find(key).subscribe(res => result = res);
return result;
}
Run Code Online (Sandbox Code Playgroud)
上述解决方案并不总是有效.这类问题的替代解决方案是什么?
您正试图Observable从函数返回getValue,return response或者return result因为请求http.get是异步的而无法工作.
以下是您可以执行的一些选项:
选项1:在模板中使用Async Pipe来订阅结果http.get并从函数中删除订阅部分getValue.
<div *ngFor="let item of data">
<span>{{item.value | async}}</span>
</div>
// return Observable and subscribe by async pipe at template
private getValue(key: number): string {
return this.keyService.find(key);
}
Run Code Online (Sandbox Code Playgroud)
选项2:定义data不带value字段的数组,稍后更新其值字段.但要小心,除非你得到回应,否则该value领域将是.undefinedthis.keyService.find(key)
public data = [
{ 'key': 1},
{ 'key': 2},
...
];
constructor() {
this.data.forEach(item => {
this.keyService.find(item.key).subscribe(response => {
item.value = response; // update value field here.
});
});
}
// here getValue function is no longer necessary.
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助.
在上面的选项中有一些细微的变化,它就像魅力一样.
以下是更改:
<div *ngFor="let item of data">
<span>{{ getValue(item.key) | async}}</span>
</div>
public getValue(key: number): any {
return this.keyService.find(key);
}
Run Code Online (Sandbox Code Playgroud)
感谢您提醒使用Async Pipe @Pengyy(来自OP)
| 归档时间: |
|
| 查看次数: |
31055 次 |
| 最近记录: |