代码之家  ›  专栏  ›  技术社区  ›  Mike_G

在rxjs中等待内部观测

  •  0
  • Mike_G  · 技术社区  · 6 年前

    我有一个函数,我想在3个OberVerable完成后返回:

    initialize(){
      let src1:Observable<Account>; //initialization omitted for brevity
      let src2: Observable<User>;   //initialization omitted for brevity
    
      // this is one is the problem
      let src3: Observable<Company[]> = this.myHttpService.getCompanies()
                                                      .pipe(
                                                         //do something that calls `this.myHttpService.getDepartments(company.id)` for each company one at a time.
                                                       );
    
      return merge(src1, src2, src3);                        
    
    }
    

    对于 src3 ,每个公司都有多个部门。我想给你打个电话 this.myHttpService.getDepartments(company.id) this.myHttpService.getDepartments 已经为每家公司打过电话。只有这样才应该 src3 完成。

    concatMap , mergeMap

    我如何看待每家公司,获得他们的部门(a) Department[] )一次一家公司,然后一旦完成, src3

    3 回复  |  直到 6 年前
        1
  •  1
  •   Suresh Kumar Ariya    6 年前

    你可以使用可观察的。forkJoin实现了这一点。

    return forkJoin([src1,src2,src3]).map(result=>{
       //output as result[0], result[1], result[2]
    });
    
        2
  •  1
  •   Picci    6 年前

    你可能想尝试一下这些方法。

    initialize(){
      let src1:Observable<Account>; //initialization omitted for brevity
      let src2: Observable<User>;   //initialization omitted for brevity
    
      // this is one is the problem
      let src3: Observable<Company[]> = this.myHttpService.getCompanies().pipe(
         map(companies: Array<any> => companies.map(
           company => this.myHttpService.getDepartments(company.id)
         )),
         switchMap(getDepObsArray: Array<Observable<any>> => forkJoin(getDepObsArray))
      );
    
      return forkJoin(src1, src2, src3);                        
    
    }
    

    forkJoin 确保

    • src3 仅在对服务的所有调用完成后返回
    • initialize src1 src2 src3
        3
  •  0
  •   A.Winnen    6 年前

    有很多方法可以实现你的目标。您可以使用Concatal、mergeMap和toArray:

    concatAll将数组解压为单个对象,mergeMap将这些对象转换为可观察到的公司部门,toArray收集mergeMap函数的输出,以确保在可观察到的完成之前检索到所有部门

    最终代码可能如下所示:

        let src3: Observable<{company: Company, departments: Department[]}[]> = this.myHttpService.getCompanies()
            .pipe(
                concatAll(), // use this if your getCompanies() function returns Observable<Company[]> to get a single company
                mergeMap(company => this.myHttpService.getDepartments(company.id).pipe(
                    map(departments => ({ company, departments })))
                ),
                toArray(), // here you receive {company: Company, departments: Department[]}[]
            );