为什么 rxjs 的 mergeMap 将数组变成单独的对象

2023-12-14

我根本不是 Typescript、Javascript 或前端开发人员。我继承了Angular 13项目。有一个函数返回Observable<Dto[]>。我在代码中看到了类似的内容:

this.service.getStuff(arg).pipe(
    mergeMap(x => x),
    concatMap(y => { return this.service.getOtherStuff(x.subObj.id).pipe(
        map(v => ({ obj1: y, obj2: v})));
    })
).subscribe(
// ... do something with results

我理解它的作用以及为什么这样做,但我一生都无法理解为什么会这样做mergeMap将数组转换为单独值的流。文档仅这么说mergeMap:

Projects each source value to an Observable which is merged in the output Observable

我的理解是source value在这种情况下是Dto[],所以投影应该是Observable<Dto[]>,不是从数组中的单独值创建的 Observables 列表。

我怀疑maybe这个动作稍后完成,但是把tap with console.log around mergeMap表明输入确实是一个数组,输出是一个流对象。

那么到底发生了什么以及为什么呢?为什么我们在使用它时文档中没有对此进行解释。


这是有意的行为。如果您查看文档,它会说project函数需要返回ObservableInput不仅仅是Observable。事实上,所有期望 Observable 作为参数的 RxJS 运算符都可以与任何ObservableInput.

ObservableInput例如,可以是 Observable(显然)、异步生成器、数组或 Promise。

所以使用mergeMap(x => x)实际上仅用于解开数组,相当于mergeMap(x => from(x))。也许更干净的解决方案会使用mergeAll()旨在与高阶可观察量一起使用的运算符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 rxjs 的 mergeMap 将数组变成单独的对象 的相关文章

随机推荐