如何将 RXJS 中的嵌套调用展平并最终调用最后一个调用?

我们如何最好地压平下面的电话。RxJS 的新手,试图了解应该如何简化它。阅读 flatMap、forkJoin、switchMap 和 mergeMap,在下面没有找到正确的集成路径,也不确定在下面的场景中哪个是最好的。


const useful = [];


a.get('abc').

subscribe((abcdatas) => {


   abcdatas.forEach(abcdata => {

     if(abcdata.exist) {

        b.get('def').

        subscribe((defdatas) => {

           useful.push(defdatas.someval);

        });

      } 

   });


 })


if(useful.length) {

 c.get('ghi').

 subscribe((ghidata) => {

   completed...

 });

}

更新

在这里更新我的问题并感谢所有回复。有用的是一个全局结果数组,在我的例子中应该从嵌套调用中填充。最后应该传递给最后一个调用。

我正在尝试的步骤:

  1. a.get() => 返回数据

  2. b.get(adataset) => 如果数据集具有存在属性,则应为每个数据集执行请求,并填充稍后将使用的有用数组

  3. c.get(useful) => 应该触发并退出。


FFIVE
浏览 457回答 3
3回答

人到中年有点甜

switchMap使用类似或 的映射函数mergeMap将一个请求的结果映射到下一个请求。用于forkJoin同时执行多个请求。所以对于一对多的场景,一般的想法是:firstRequest().pipe(&nbsp; switchMap(results => forkJoin(results.map(r => nextRequest(r)))))对于你的情况,这将是这样的:useful = [];a.get('abc').pipe(&nbsp; switchMap(abcdatas => forkJoin(getUseFulRequests(abcdatas))),&nbsp; tap(useful => useful.forEach(u => this.useful.push(u))),&nbsp; switchMap(useful => useful.length ? c.get('ghi') : EMPTY)).subscribe((ghidata) => {&nbsp; completed...});function getUseFulRequests(abcdatas: AbcData[]): Observable<SomeVal>[] {&nbsp; return abcdatas.reduce((acc, abcdata) => {&nbsp; &nbsp; if (abcdata.exist) {&nbsp; &nbsp; &nbsp; const request = b.get('def').pipe(&nbsp; &nbsp; &nbsp; &nbsp; map(defdatas => defdatas.someval)&nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; acc.push(request);&nbsp; &nbsp; }&nbsp; &nbsp; return acc;&nbsp; }, []);}getUseFulRequests(abcdatas)如果返回一个空数组或 ,这将不会发出任何东西useful.length == 0。

茅侃侃

我认为你正在尝试做的是:a.get("abc").pipe(&nbsp; mergeMap((abcdatas) => abcdatas.filter((abcdata) => abcdata.exist)), // let's create a stream with all those useful abcdata&nbsp; mergeMap(abcdata => b.get('def')), // and for each one of those we perform a b.get request&nbsp; toArray(), // once all the b.get requests have completed, emit a one value stream with an Array of those values values&nbsp; concatMap(useful => useful.length ? c.get('ghi') : EMPTY) // let's concat that result with the final request)

万千封印

我相信处理这个问题的最好方法是使用高阶可观察量考虑下面的代码useful$ = a.get('abc').pipe(&nbsp; mergeMap(abcdatas =>&nbsp;&nbsp; &nbsp; abcdata.exist ? forkJoin(abcdatas.map(abcdata => b.get('def'))) : of(undefined)&nbsp; ),&nbsp; map(defdatas => defdatas.flat()),&nbsp; mergeMap(({ length }) => length ? c.get('ghi') : of(undefined)));useful$.subscribe({&nbsp; next: () => {&nbsp;&nbsp; &nbsp; // Completed...&nbsp; }})我们首先通过管道传输 的结果a.get('abc')并使用 mergeMap 来测试 if abcdata.exist。如果它确实退出,我们forkJoin(abcdatas.map(abcdata => b.get('def')))简单地返回这将组合从 abcdatas 上的 map 函数生成的可观察数组map(defdatas => defdatas.flat()),将数组转换为单个数组 注意:flat() 是在 ES2019 中引入的接下来我们解构这个length属性,如果它存在,我们返回我们最终的可观察对象
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript