【问题标题】:rxjs map parameter is the entire arrayrxjs map 参数是整个数组
【发布时间】:2018-08-16 03:19:12
【问题描述】:
public observableA = (id: string): Observable<Array<any>>=>{

}

public observableB = (id: string): Observable<Array<myClass>>=>{
    observableA(metroId).map((x)=>{
         return new myClass(
            x.FacilityName,
            x.ID)
    };
}

export class myClass{
    ID: string;
    Name: string;
    constructor(id: string, name: string){this.ID=id;this.Name=name;}
}

ObservableA 返回一个对象数组,我正在编写一个函数 ObservableB 以使用返回的 ObservableA 数组返回一个 myClass 数组。

当我调试这段代码时, 我可以看到 map 参数中的“x”是来自 ObservableA 的整个数组,而不是数组的对象元素。

因此无法访问属性。

可能出了什么问题?

更新: 有没有办法将 Array 的单个 Observable 变成 Observable 的数组,以便我可以处理元素?

【问题讨论】:

  • 这不是您所期望的吗? Observable.map 映射到 流中 的每个项目,而不是流恰好包含的数组中。您可能会将其与 Array.map 混淆。
  • @jonrsharpe 哦,我认为它类似于 lodash 的地图
  • 从外观上看,这也基本上是Array.map。参见例如stackoverflow.com/q/42482705/3001761.
  • 编辑后的问题还是很奇怪。我怀疑你是否想要一系列可观察的。我认为您还不了解 observables 的概念,建议您先阅读更多相关信息。

标签: angular typescript rxjs observable


【解决方案1】:

我认为你误解了 observables 的工作原理。

你得到了整个数组,因为这就是 observable 正在使用的。这是一个Observable&lt;Array&lt;any&gt;&gt;,所以map 运算符将得到一个Array&lt;any&gt;。如果你想一次处理一个对象,你的 observable 应该是 Observable&lt;any&gt; 类型(或者更好,使用像 Observable&lt;TestClass&gt; 这样的具体类)

您可以使用fromArray&lt;T&gt; 创建Observable&lt;T&gt;,请参阅此页面: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-from

我不知道这如何适用于你,因为你没有发布 observableA 的工作原理。

这是我学习 RxJs 时使用的一些资源:

【讨论】:

    【解决方案2】:

    我认为不需要第二个 Observable,也许这是您想要实现的,但如果我错了请告诉我,我会相应地更新:

    live example

    import { Observable } from 'rxjs/Observable';
    import { async } from 'rxjs/scheduler/async';
    import { from } from 'rxjs/observable/from';
    
    import { map } from 'rxjs/operators';
    
    const metroId: string = "IamAnId";
    const arry: Array<myClass> = [];
    const observableA: (id: string) => Observable<any> = (id: string) => {
        // use your id whatever you want
        return from([
            {
                FacilityName: 'name',
                ID: 'IamAnotherId'
            },
            {
                FacilityName: 'AnotherName',
                ID: 'AlsoHere'
            }
        ], asyn);
    }
    
    observableA(metroId)
        .pipe(map(x => {
            return new myClass(
                x.FacilityName,
                x.ID)
        }))
        .subscribe(itemClass => {
            arry.push(itemClass);
        })
    

    【讨论】:

    • 这个 x 是整个数组,所以我无法访问元素的属性值。我认为如果 observableA 返回 Observable.from,这将起作用
    • 我的错,我使用了错误的创建者(of)。 Observable.of 和 Observable.from 默认情况下是同步的(这就是为什么你从一次获取整个数组的原因)。但是你可以通过添加一个 Scheduler 作为第二个参数 (async) 来将 Observable.from 更改为异步的。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多