Angular 将管道()链内的两个可观察对象合并

Angular 将管道()链内的两个可观察对象合并,angular,observable,rxjs6,rxjs-observables,combinelatest,Angular,Observable,Rxjs6,Rxjs Observables,Combinelatest,我使用的是Rxjs,我想从以下模式(按顺序)创建一个可观察的对象: 从paramMap$获取参数,然后 基于params的值,将两者(getData():Observable,getCategories():Observable)一起获取,然后 从([数据,类别])创建最终对象 代码如下所示: //route = this.ActivatedRoute let obs$ = route.paramMap.pipe( // combineLatest() is not a pipable

我使用的是Rxjs,我想从以下模式(按顺序)创建一个可观察的对象:

  • 从paramMap$获取参数,然后

  • 基于params的值,将两者(getData():Observable,getCategories():Observable)一起获取,然后

  • 从([数据,类别])创建最终对象

  • 代码如下所示:

    //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 project中放置此代码的最佳位置是:

    • constructor()
      不是最佳实践,因为这是一个长期运行的操作(实际上它必须执行API请求)

    • 不建议使用
      ngOnInit()
      ,因为在某些情况下,我必须更改模板中使用的
      此.params

    在模板中:

    <div>{{params.type}}</div>
    
    {{params.type}
    
    对于获取参数后可观察的管道,可以使用
    开关映射
    并从其中返回一个
    forkJoin()

    this.route.paramMap.pipe(switchMap((params) => {
        return forkJoin(getData(params.id), getCategories(params.id));
    }));
    
    我认为,订阅一个可观察的、执行API请求的,理想情况下都应该转到
    ngOnInit()
    ,除非您有一些非常具体的要求,在加载组件时您不需要这些订阅


    this.params
    而言,您可以使用管道
    tap()
    或订阅此可观察对象的位置在下分配
    this.params

    对于获取参数后管道化可观察对象,您可以使用
    开关映射
    并从其中返回
    forkJoin()

    this.route.paramMap.pipe(switchMap((params) => {
        return forkJoin(getData(params.id), getCategories(params.id));
    }));
    
    我认为,订阅一个可观察的、执行API请求的,理想情况下都应该转到
    ngOnInit()
    ,除非您有一些非常具体的要求,在加载组件时您不需要这些订阅


    this.params
    而言,您可以使用管道
    tap()
    或在订阅此可观察对象的位置下分配
    this.params

    我没有回答您问题的第二部分。>因为在某些情况下,我应该更改模板中使用的this.params which,这对在
    ngOnInit()
    中执行此过程有何影响检查完成后无法更改模板中使用的值,因此将此代码移动到
    ngOnInit
    不是最佳做法@Ashish RanjanI不相信会对
    ngOnInit()
    进行检查,此时甚至视图都没有创建。我没有回答您问题的第二部分。>因为在某些情况下,我应该更改模板中使用的this.params which,这对在
    ngOnInit()
    中执行此过程有何影响检查完成后无法更改模板中使用的值,因此将此代码移动到
    ngOnInit
    不是最佳做法@Ashish RanjanI认为不会对
    ngOnInit()
    进行检查,此时甚至视图也不会创建。