【问题标题】:When to use RxJS Observable<Object[]> and Observable<Object>?何时使用 RxJS Observable<Object[]> 和 Observable<Object>?
【发布时间】:2018-08-14 12:37:16
【问题描述】:

使用 Angular 6,我根据 hero app 定义了我的服务。如果一个方法应该返回多个值,我总是返回一个Observable&lt;A[]&gt;,如果我期望一个返回,例如如果方法是getById,我返回Observable&lt;A&gt;

问题是,今天我想对返回的值数组之一执行groupBy(),我能找到的所有示例都使用Observable&lt;A&gt; 而不是Observable&lt;A[]&gt;like this one。另外,看看answers hereI tried it,这只适用于~Observable&lt;A&gt;)和RxJS introductionObservable: represents the idea of an invokable collection of future values or events.),看来我应该使用Observable&lt;A&gt;来收集像服务器返回一样的东西,但不是单值返回用什么?

示例服务:

  all(): Observable<T[]> {
    return this.httpClient.get<T[]>(this.urls().allURL());
  }

  paginate(pageRequest: any): Observable<Page<T>> {
    return this.httpClient.post<Page<T>>(this.urls().paginateURL(), pageRequest);
  }

  findOneById(id: number): Observable<T> {
    return this.httpClient.get<T>(this.urls().byIdURL(id));
  }

更新:

I made a sample project。我可以像这样使用数组 observables,但是我总是需要一个mergeMap。我知道,如果我使用 Observable&lt;A[]&gt; ,我将一次获取所有值,因为它们在一个数组中,但是如果我使用 Observable&lt;A&gt; ,我会一一获取它们,这就是为什么我不能使用它*ngFor 例如(期望数组)。问题是,当服务器同步返回一个集合时,我是否总是使用A[],如果我使用异步数据,我是否还需要考虑其他场景。

import { Component, OnInit } from '@angular/core';
import { Observable, from, of, GroupedObservable } from 'rxjs';
import { distinct, map, mergeMap, toArray, groupBy } from 'rxjs/operators';

export class ModelA {
  id: number;
  name: string;
}

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
  name = 'Angular';

  models: Observable<ModelA[]>;
  distinctModels: Observable<ModelA[]>;
  groupedModels: Observable<ModelA[][]>;

  ngOnInit() {
    this.loadData();
  }

  loadData(): void {
    this.models = of([
      {id: 1, name: 'Name A'},
      {id: 2, name: 'Name A'},
      {id: 3, name: 'Name B'},
      {id: 4, name: 'Name C'}
    ]);

    this.distinctModels = this.models
        .pipe(
          mergeMap(models => models),
          distinct(m => m.name),
          toArray()
        );
    this.distinctModels.subscribe( m => console.log(m));

    this.groupedModels = this.models
        .pipe(
          mergeMap(models =>models),
          groupBy(model => model.name),
          mergeMap(toArray()),
          toArray()
        );
    this.groupedModels.subscribe( m => console.log(m));
  }
}

【问题讨论】:

  • 您可以在 httpClient get 中使用不同的返回类型,在您的函数中使用另一种。只需使用 map 来转换响应: http.client.get(...).pipe(map(response:T[]=>{....return T}).
  • @Eliseo 我的问题主要是,最佳实践是什么?我是否只是在任何地方使用Observable&lt;A&gt;,而不是获得第一个值?

标签: angular typescript rxjs observable


【解决方案1】:

我不确定你想要什么。 If is a Group just Observable

export class AppComponent implements OnInit {
  people: any[] = [
   { name: 'Sue', age: 25 },
   { name: 'Joe', age: 30 },
   { name: 'Frank', age: 25 },
   { name: 'Sarah', age: 35 }
  ];
  result:any[][];

  ngOnInit()
  {
    this.myObservable().subscribe(res=>{
      this.result=res;
    })
  }

  myObservable():Observable<any[][]>
  {
    return from(this.people).pipe(
      groupBy((person:any)=>person.age),
      mergeMap(group=>group.pipe(toArray())),
      toArray());
  }

还有.html

  <div *ngFor="let ages of result">
    <strong>{{ages[0].age}}</strong>
    <div *ngFor="let item of ages">
      {{item.name}}
    </div>
  </div>

【讨论】:

  • 我更新了我的问题。顺便谢谢你的group by code,我可以用了!
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 2018-05-09
  • 2018-11-02
  • 2017-03-11
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多