Angular如何使用rxjs管道

时间:2018-05-17 02:44:39

标签: angular rxjs6

我在我的服务文件中调用了一个名为getWorkOrders()的方法,该方法又调用服务器来获取记录。

这是我的服务。我正在使用新的HttpClient。

export class BackendServices {
  private BASE_URL ='http://localhost:3000/backend';
  constructor(private http: HttpClient) {}
  getWorkOrders(){
    return this.http.get(this.BASE_URL + '/getworkorders/');
 }
}

Component.ts文件

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .subscribe((data: any) =>
            this.woSubject.next(data),
        );
      }

从组件getWorkOrders方法中,如何过滤从服务器获取的所有记录中的数据。我知道它正在使用管道和过滤器rxjs运算符,但不知道如何将它组合在一起。

enter image description here

1 个答案:

答案 0 :(得分:9)

如果要使用rxjs过滤器过滤来自服务器的工作单,则需要将工作单元数组转换为可观察的工作单元,例如。

export class BackendServices {
    private BASE_URL ='http://localhost:3000/backend';
    constructor(private http: HttpClient) {}

    getWorkOrders(){
        return this.http.get(this.BASE_URL + '/getworkorders/')
                   .pipe(map((data) => Observable.from(data));
    }
}

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .pipe(
              filter(data => data.timestamp > 123456786 ),
              toArray()
           )
          .subscribe((data: any) =>
               this.woSubject.next(data),
           );
        }

另一种方法是使用标准数组过滤器过滤地图中的数组,例如

export class BackendServices {
    private BASE_URL ='http://localhost:3000/backend';
    constructor(private http: HttpClient) {}

    getWorkOrders(){
        return this.http.get(this.BASE_URL + '/getworkorders/');
    }
}

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .pipe(map(data => data.filter(workorder => workrder.timestamp > 123456786) )
          .subscribe((data: any) =>
               this.woSubject.next(data),
           );
        }

我要问的一个问题是,为什么要将可观察订阅的结果推入行为主题?通常,如果您将订阅的结果推送到另一个observable,您可以通过组合observable来实现相同的目标