Nested Observables:我在做什么错?

时间:2019-06-12 16:58:38

标签: angular rxjs

我正在订阅一个observable,并使用a属性(结果中的一个数组)进行调用并修改该数组中的每个项目并返回最终结果或输出。

下面是我当前无法使用的代码。我不确定自己在做什么错。 为了使此代码正常工作,我应该进行哪些更改?

$..data[?(@.key==266)]

此代码似乎有效,但效率不高。我提供它是为了通过代码更好地阐明我的目标。

{"data": {
    "Aatrox": {
        "version": "8.19.1",
        "id": "Aatrox",
        "key": "266",
        "name": "Aatrox",
        "title": "the Darkin Blade"
    },
    "Ahri": {
        "version": "8.19.1",
        "id": "Ahri",
        "key": "103",
        "name": "Ahri",
        "title": "the Nine-Tailed Fox"
    }
}
}

2 个答案:

答案 0 :(得分:0)

我不确定我是否有想要做的事情,但是我想你想要这样的事情:

this.esService.search(JSON.stringify(query)).pipe(
  tap((response) => this.esResponse = response),
  switchMap((response) => {
    const arrayOfObservables: any[] = response.hits.hits.map((item) =>
      this.productService.getProductById(this.schemaId,
       item['_source']['consensusAssessmentId']).pipe(tap((resp) => {
          const answers = resp['answers'];
          const meets_count = answers.reduce((acc, cur) => cur.value === "Meets" ? ++acc : acc, 0);
          const needs_count = answers.reduce((acc, cur) => cur.value === "Needs Improvement" ? ++acc : acc, 0);
          item['_source']['meets'] = meets_count.toString();
          item['_source']['needs'] = needs_count.toString();
        }))
    );
    return forkJoin(arrayOfObservables);

  })).subscribe((resp) => this.rows = resp.map(
    this.esService.convertToPE));

答案 1 :(得分:0)

您似乎对可观察性的工作原理有所了解,但让我们通过简化方法来改变解决问题的方式。首先,我们不是使用嵌套/链接多个subscribe()方法,而是使用pipeable operators

然后,我们使用RxJS的mergeMap运算符将search()的可观察值映射到内部getProductById()将使用的可观察值。

mergeMap()块中,我们需要遍历由常量变量result表示的数组。我们遍历result数组中的每个元素,然后将每个可观察到的元素从getProductById()推入observablesList。然后,我们使用forkJoin()运算符,该运算符等待迭代完成,然后返回所有可观察值。

不要忘记将所需的运算符导入您的类/组件中。

import { forkJoin } from 'rxjs';
import { mergeMap } from 'rxjs/operators';

this.esService.search(JSON.stringify(query)).pipe(
    mergeMap(response => {
      this.esResponse = response;
      const result = this.esResponse.hits.hits;
      const observablesList = [];
      observablesList = result.map(obj => {
        const id = obj['_source']['consensusAssessmentId'];
        return this.productService.getProductById(this.schemaId, id);
      });
      return forkJoin(observablesList);
    })
  ).subscribe(resp => {
    console.log(resp);
     // handle the rest here
     const answers = resp['answers'];
     const meets_count = answers.reduce((acc, cur) => cur.value === "Meets" ? ++acc : acc, 0);
     const needs_count = answers.reduce((acc, cur) => cur.value === "Needs Improvement" ? ++acc : acc, 0);
     item['_source']['meets'] = meets_count.toString();
     item['_source']['needs'] = needs_count.toString();

     // more things
  })
});
相关问题