在 pipe() 链中组合两个 observable
Combine two observables inside pipe() chain
我正在使用 Rxjs,我想根据以下模式(按顺序)创建一个 Observable:
从 paramMap$ 获取参数,然后...
根据params的值,将两者(getData():Observable, getCategories():Observables)放在一起,然后....
从 ([data, categories]) 创建最终对象。
代码如下:
//route = this.ActivatedRoute
let obs$ = route.paramMap.pipe(
// combineLatest() is not a pipable operator, so it shouldn't be used inside .pipe()
// also it doesn't accept a function,
// but this just to show you what I want to do.
combineLatest(params=>getData(params.id), params=>getCategories(params.id)),
map(([data, categories])=>{
//do some changes...
return {data,categories}
}
)
)
此外,将此代码放在 Angular 项目中的最佳位置:
constructor()
不是最佳实践,因为这是一个长 运行 操作(实际上它必须执行 API 请求)
不推荐ngOnInit()
,因为在某些时候我必须更改模板中使用的this.params
...
combineLatest(params=>
getData(params.id).pipe(
map(data=>{
this.params.type=data.type;
return data
})),
params=>getCategories(...)
)
在模板中:
<div>{{params.type}}</div>
为了在获取参数后通过管道传输 Observable,您可以在其中使用 switchMap
和 return a forkJoin()
。
this.route.paramMap.pipe(switchMap((params) => {
return forkJoin(getData(params.id), getCategories(params.id));
}));
我相信,订阅 Observable,执行 API 请求,理想情况下都应该转到 ngOnInit()
除非你有一些非常具体的要求,在组件加载时不需要这些订阅。
就 this.params
而言,您可以在使用管道 tap()
或您为此 Observable 进行订阅的地方分配 this.params
。
我正在使用 Rxjs,我想根据以下模式(按顺序)创建一个 Observable:
从 paramMap$ 获取参数,然后...
根据params的值,将两者(getData():Observable, getCategories():Observables)放在一起,然后....
从 ([data, categories]) 创建最终对象。
代码如下:
//route = this.ActivatedRoute
let obs$ = route.paramMap.pipe(
// combineLatest() is not a pipable operator, so it shouldn't be used inside .pipe()
// also it doesn't accept a function,
// but this just to show you what I want to do.
combineLatest(params=>getData(params.id), params=>getCategories(params.id)),
map(([data, categories])=>{
//do some changes...
return {data,categories}
}
)
)
此外,将此代码放在 Angular 项目中的最佳位置:
constructor()
不是最佳实践,因为这是一个长 运行 操作(实际上它必须执行 API 请求)
不推荐ngOnInit()
,因为在某些时候我必须更改模板中使用的this.params
...
combineLatest(params=>
getData(params.id).pipe(
map(data=>{
this.params.type=data.type;
return data
})),
params=>getCategories(...)
)
在模板中:
<div>{{params.type}}</div>
为了在获取参数后通过管道传输 Observable,您可以在其中使用 switchMap
和 return a forkJoin()
。
this.route.paramMap.pipe(switchMap((params) => {
return forkJoin(getData(params.id), getCategories(params.id));
}));
我相信,订阅 Observable,执行 API 请求,理想情况下都应该转到 ngOnInit()
除非你有一些非常具体的要求,在组件加载时不需要这些订阅。
就 this.params
而言,您可以在使用管道 tap()
或您为此 Observable 进行订阅的地方分配 this.params
。