【问题标题】:Converting rxjs 5 map to rxjs 6 map将 rxjs 5 映射转换为 rxjs 6 映射
【发布时间】:2018-08-14 18:24:27
【问题描述】:

考虑以下代码 Angular 5 + old rxjs

this.measurementUnitsService.GetAll().subscribe(
        res => {
            this.measurementUnits = res.map(x => new MeasurementUnit(x));
        }
    )

我得到一个对象列表,并为每个对象创建一个新的强类型类。

我将如何在 angular 6 + rxjs 6 中做同样的事情 我的尝试。

this.measurementUnitsService.GetAll().pipe<MeasurementUnit[]>(mergeMap(x => new MeasurementUnit(x))).subscribe(
  res => {
    this.measurementUnits = res;
  }
)

不幸的是,它会产生错误Type 'MeasurementUnit[]' has no properties in common with type 'Partial&lt;MeasurementUnit&gt;'.

MeasurementUnit以防万一

export class MeasurementUnit {
Id: number;
CreatedDate: Date;
ModifiedDate: Date;
Disabled: boolean;
DisabledDate: Date;
Name: string;
Description: string;

ParentId: number;

public constructor(item: Partial<MeasurementUnit>) {
    //item.EstablishedDate = new DatePipe('en-US').transform(item.EstablishedDate, "yyyy-MM-dd");

    Object.assign(this, item);
}
}

【问题讨论】:

  • 您使用的是 mergeMap 而不是 map 。是故意的吗?
  • 如果我没看错,你根本不需要改变任何东西——你只是在映射一个数组,而不是一个 observable,而 RxJS 6 与此无关。
  • @Niladri 任何一个都会产生相同的错误。当我尝试不同的选项时,map 似乎产生了更严重的错误,所以我将其更改为mergeMap。现在他们都包皮过同样的错误。
  • this.measurementUnits 的类型是什么?是Partial&lt;MeasurementUnit&gt;
  • @JohnMontgomery 啊,这是有道理的。我对整个可观察模式有点陌生,我认为 map 总是与 rxjs 有关。

标签: javascript angular rxjs angular6 rxjs6


【解决方案1】:

你有一个Observable&lt;MeasurementUnit[]&gt; 而不是Observable&lt;MeasurementUnit&gt;

这意味着,当 observable 发出一个值时,它将是一个数组而不是单个值。因此,您需要普通的 array 映射,而不是 Observable 映射。

只要做:

this.measurementUnitsService.GetAll()
  .pipe(
    map(array => array.map(x => new MeasurementUnit(x)))
  ).subscribe(res => this.measurementUnits = res);

【讨论】:

  • 有道理。这似乎与我所拥有的基本相同。与原始解决方案(有效)相比,这是否会产生任何好处,例如 treeshaking 以及可管道操作员应该更擅长的所有东西?
  • 不,没有真正的区别。这只是更实用的方式,在subscribe 中做事是必要的。如果您稍后想向 pipe() 运算符添加更多转换,或者您想在模板中使用 Angular 的 async 管道而不是手动处理订阅,那么这种方式将是有益的。
  • @americanslon 原始代码使用 rxjs map 运算符来转换 Observable 的每个发出的值,但在 map 内部,您需要使用 JavaScript 中的 Array.map 来转换 Observable 的每个发出的数组值,如果您期望Observable&lt;MeasurementUnit[]&gt; 来自 measureUnitsService.GetAll() 方法。
  • @KimKern 您的代码有效,但我在array.map 上收到智能感知错误。 Property map doesn't exists on the type {}。似乎认为array 是{}。事实上,我在使用 pipable 运算符的任何地方都有这个问题——他们都认为他们得到的值是 {} 类型。如果你想看一下,我有一个完整的主题。 stackoverflow.com/questions/51845336/…
  • 您能否在MeasurementUnitsService 中将Observable&lt;MeasurementUnit[]&gt; 作为返回类型添加到GetAll
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多