【问题标题】:Angular 12/rxjs: howto handle forkJoin in separate methodAngular 12/rxjs:如何以单独的方法处理 forkJoin
【发布时间】:2021-09-21 22:19:00
【问题描述】:

给出以下代码 sn-p,它执行以下操作:

  1. 先获取列表
  2. 那么一旦 1) 完成,调用 initRouter()
ngOnInit(): void {

   forkJoin([
      this.httpHandlerCached.getListsA(),
      this.httpHandlerCached.getListsB(),
      this.httpHandlerCached.getListsC()
   ]).subscribe(res => {
        this.listA = res[0];
        this.listB = res[1];
        this.listC = res[2];
        this.initRouter();
   })
}
 
initRouter(){
    this.route.params.subscribe(params =>
      //do something with params and lists...
}

如何将第一个 forkjoin-part 放入这样的自己的方法中:

ngOnInit(): void {

   //Pseudo-Code:
   this.initListReturnForkJoin().subscribe(res => {
        this.listA = res[0];
        this.listB = res[1];
        this.listC = res[2];
        this.initRouter();
   })
}

//Pseudo-Code:
initListReturnForkJoin(): ??? {
   return forkJoin([
      this.httpHandlerCached.getListsA(),
      this.httpHandlerCached.getListsB(),
      this.httpHandlerCached.getListsC()
   ])
}
 
initRouter(){
    this.route.params.subscribe(params =>
      //do something with params and lists...
}

对不起,我不知道如何更好地表达这个问题......感谢任何指导

【问题讨论】:

  • 是的,它看起来与您建议的完全一样。返回类型为Observable<[listAtype, listBtype,listCtype]>
  • 谢谢!

标签: angular typescript rxjs fork-join


【解决方案1】:

嵌套订阅通常是代码异味。您可以再次使用forkJoin 或尝试withLatestFrom(例如)以避免嵌套订阅。

ngOnInit(): void {

  this.route.params.pipe(
    // Update your lists every time the route emits
    withLatestFrom(this.fetchLists())
  ).subscribe(([params, listDict]) => {

    // Right here, both params and lists are defined
    this.doSomethingWithFetchedLists();

  });

}

// I don't know the types of your lists, 
// so I've put `any` as a placeholder for now.
fetchLists(): Observable<[any[],any[],any[]]> {

  return forkJoin({
    listA: this.httpHandlerCached.getListsA(),
    listB: this.httpHandlerCached.getListsB(),
    listC: this.httpHandlerCached.getListsC()
  }).pipe(
    tap(listDict => {
      // Update some global values as a side-effect of this
      // observable emitting. 
      this.listA = listDict.listA;
      this.listB = listDict.listB;
      this.listC = listDict.listC;
    })
  );
  
}

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2019-01-30
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多