在RxJS中,地图无法执行可观察到的内部地图

时间:2019-01-18 16:54:49

标签: rxjs rxjs6

RxJS的新手,但我试图将单个内部元素流映射到另一个元素流,该元素流在所有内部/后续流完成/加载之后生成数组 。但是,我内在的可观察性似乎并没有执行。他们只是变得寒冷。

高级别,我需要执行http post来上传文件列表(在两个不同的数组中到两个不同的端点)。因为它们很大,所以我模拟了5秒的延迟。这些请求需要并行执行,但仅限于一次同时执行X(此处为2)。所有这些都需要放在管道内,并且管道应该只允许流在所有帖子完成后 继续。

https://stackblitz.com/edit/rxjs-pnwa1b

oid

内部订阅不会等到它们完成。使用forkJoin不允许我限制并发上传。我该怎么做?

更新

@dmcgrandle的回答非常有帮助,使我进行了以下似乎有效的更改:

pg_type

1 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么我认为这是一个解决方案。您的问题在于第一个map,它不会执行内部订阅,而只是将流转换为Observables of Observables,这似乎并不是您想要的。相反,我在那里使用mergeMap

from的内部,我使用concatMap强制从firstsecond发出的每个发射按顺序发生,并等待一个发射完成后再开始另一个发射。我还设置了postToEndpoint函数,这些函数返回Observables使其更接近您的实际代码。

StackBlitz演示

代码:

import { mergeMap, concatMap, delay, tap, catchError, toArray } from 'rxjs/operators';
import { merge, of, from, concat, throwError } from 'rxjs';

const single = "name";

const first = ["abc", "def"];

const second = of("ghi", "jkl", "mno");

const postToEndpoint1$ = photo => of(photo).pipe(
  tap(data => console.log('start of postTo1 for photo:', photo)),
  delay(5000),
  tap(data => console.log('end of postTo1 for photo:', photo))
);

const postToEndpoint2$ = video => of(video).pipe(
  tap(data => console.log('start of postTo2 for video:', video)),
  delay(5000),
  tap(data => console.log('end of postTo2 for video:', video))
);

of(single).pipe(
  tap(val => console.log(`initial emit:${val}`)),
  mergeMap(claim => 
    merge(
      from(first).pipe(concatMap(postToEndpoint1$)),
      from(second).pipe(concatMap(postToEndpoint2$))
      )
  ),
  toArray(),
  catchError(error => {
    console.log("error");
    return throwError(error);
  })
).subscribe(val => console.log(`final:`, val));

我希望这会有所帮助。