首页 > 解决方案 > RxJs - 动态地将相互依赖的同步调用添加到没有嵌套的 fork join

问题描述

我试图避免嵌套一些相互依赖的同步调用。当一切都完成后,我还想在最终结果中进行订阅,比如 forkjoin。

我已经找到了如何在 stackoverflow 上执行此操作(在继续主订阅(rxJs)之前等待角度的嵌套订阅),但不是如何动态地执行此操作。

目前我正在使用回调,但是当所有完成/ forkjoin 行为时,这不适用于订阅:

public keys = ['stateId', 'countyId'];


function populate(index, params = null) {


let route = this.baseRoute + this.keys[index];

this.apiCall(route, params).subscribe(response => {

if (index + 1 < keys.length) {
this.populate(index + 1, this.getParamsFromResponse(response));

}
      

这是上面引用的stackoverflow链接的答案:

 getData() {
  isLoading = true;
  this.someSevice.getSomeData().pipe(
    mergeMap(getUserData),
    mergeMap(getMetadata),
  )
  .subscribe(
    response => {
      isLoading = false;
    },
    error => {
      isLoading = false;
      this.errors = error;
    },
  );
}

使用上面引用的stackoverflow链接中的答案,我不知道如何

A - 通过循环动态插入mergeMaps,而不是硬编码它们

B - 将适当的参数传递给 mergeMaps(路由和参数)

我会很感激任何帮助。谢谢。

标签: angulardictionaryrxjsobservablesubscribe

解决方案


是你的意思吗?如果您可以在数组中包含可观察对象,则可以使用reduce运算符按顺序遍历它们。

 ngOnInit() {
    const listOfString = ['item1', 'item2', 'item3', 'item4'];
    listOfString
      .slice(1, listOfString.length) // has to exclude the first item as we already defined it below
      .reduce(
        (a, b) => a.pipe(mergeMap((aResult) => this.getData(b, aResult))),
        this.getData(listOfString[0], null) //first call
      )
      .subscribe();
  }

  getData(input: string, params: string): Observable<string> {
    const result = `${input} ${params ? params : ''}`;
    console.log(result);
    return of(result);
  }

推荐阅读