RxJS的新手,但我试图将单个内部元素流映射到另一个元素流,该元素流在所有内部/后续流完成/加载之后生成数组 。但是,我内在的可观察性似乎并没有执行。他们只是变得寒冷。
高级别,我需要执行http post来上传文件列表(在两个不同的数组中到两个不同的端点)。因为它们很大,所以我模拟了5秒的延迟。这些请求需要并行执行,但仅限于一次同时执行X(此处为2)。所有这些都需要放在管道内,并且管道应该只允许流在所有帖子完成后 继续。
https://stackblitz.com/edit/rxjs-pnwa1b
oid
内部订阅不会等到它们完成。使用forkJoin不允许我限制并发上传。我该怎么做?
更新:
@dmcgrandle的回答非常有帮助,使我进行了以下似乎有效的更改:
pg_type
答案 0 :(得分:1)
如果我对您的理解正确,那么我认为这是一个解决方案。您的问题在于第一个map
,它不会执行内部订阅,而只是将流转换为Observables of Observables,这似乎并不是您想要的。相反,我在那里使用mergeMap
。
在from
的内部,我使用concatMap强制从first
和second
发出的每个发射按顺序发生,并等待一个发射完成后再开始另一个发射。我还设置了postToEndpoint
函数,这些函数返回Observables使其更接近您的实际代码。
代码:
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));
我希望这会有所帮助。