Rxjs 为Observable中的每个项目调用api,并将其“合并”回Observable

Rxjs 为Observable中的每个项目调用api,并将其“合并”回Observable,rxjs,rxjs6,Rxjs,Rxjs6,我有一个由用户选择的可观察项目。每个选定项都用作api调用的源。api调用的结果应该合并为一个可观察的结果 我似乎不明白的是如何将结果合并回来。我尝试使用扫描操作符,但累加器只会增长 我有这个: 进口{ 可见的, 主题 属于 从…起 }来自‘rxjs’; 进口{ 地图 合并 平面图 }来自“rxjs/运营商”; 函数apurialbumid:String{ 返回`https://jsonplaceholder.typicode.com/albums/${albumId}` } const al

我有一个由用户选择的可观察项目。每个选定项都用作api调用的源。api调用的结果应该合并为一个可观察的结果

我似乎不明白的是如何将结果合并回来。我尝试使用扫描操作符,但累加器只会增长

我有这个:

进口{ 可见的, 主题 属于 从…起 }来自‘rxjs’; 进口{ 地图 合并 平面图 }来自“rxjs/运营商”; 函数apurialbumid:String{ 返回`https://jsonplaceholder.typicode.com/albums/${albumId}` } const albums$=新主题; const responseStream=相册$.pipe FlatMapAlbumId=>AlbumId, flatMapid=>fromfetchapiUriid, flatMapresp=>resp.json, /*我不知道如何把它合并成一个可观察的物体*/ ; responseStream.subscriberesp=>console.logresp 常量randomCodes1=['5','1','3'];
专辑$.nextrandomCodes1 这是允许您创建您正在寻找的responseStream的代码

const responseStream = albums$.pipe(
  map(albumIds => albumIds.map(id => from(fetch(apiUrl(id))).pipe(mergeMap(resp => resp.json())))),
  mergeMap(obsOfIds => forkJoin(obsOfIds)),
);
首先,让我们关注forkJoin。您可以向该操作符传递一个可观测值数组,该操作符将返回一个可观测值,该可观测值在输入数组中的所有可观测值都已发射时发射,并且它将发射一个包含输入数组中每个可观测值发射值的数组

这是你可能正在照顾的。如何创建所需的观察值数组?这是由第一个贴图操作符执行的操作

map(albumIds => albumIds.map(id => from(fetch(apiUrl(id))).pipe(mergeMap(resp => resp.json()))))
当你看那个操作符的时候,考虑一件事

map(albumIds => albumIds.map(id => from(fetch(apiUrl(id))).pipe(mergeMap(resp => resp.json()))))
您使用的是2倍贴图,但它们不是相同的贴图。firs映射,即最外部的映射,是可观测的映射算子。第二个映射,即最内部的映射,是数组的映射方法


我已经更新了you stackblitz,它似乎工作正常。

啊,我明白了。这是有道理的,而且有效。我看不到编辑过的stackblitz,但我应用了你的代码,这正是我想要的。谢谢!