如何在RXJS Observable中转换属性

Zer*_*lve 2 javascript observable rxjs angular

我必须在RXJS Observable中转换对象属性。使用“地图”运算符可以工作。当我两次订阅同一个可观察对象时,将发生问题:属性被两次转换

我尝试使用“共享”运算符和多种变体,但似乎无济于事

代码示例:

    const source = of(
      { id: 1, name: 'John' },
    );

    const personObservable = source.pipe(
      map(person => { 
        person.name = person.name + '_test'; return person; 
      }),
    );

    personObservable.subscribe(
      person => console.log('first: ', person)
    );

    personObservable.subscribe(
      person => console.log('second: ', person)
    );

Run Code Online (Sandbox Code Playgroud)

预期结果:

first:  John_test
second:  John_test
Run Code Online (Sandbox Code Playgroud)

实际结果:

first:  John_test
second:  John_test_test
Run Code Online (Sandbox Code Playgroud)

Lud*_*vik 5

这是因为您要两次修改同一对象实例。当地图返回该对象的副本时,将不会发生。尝试这个:

const personObservable = source.pipe(
      map(person => ({
          ...person,
          name: person.name + '_test'
      })),
    );
Run Code Online (Sandbox Code Playgroud)

您还可以将shareReplayoperator与原始映射功能一起使用:

const personObservable = source.pipe(
  map(person => { 
        person.name = person.name + '_test'; return person; 
      }),
  shareReplay()
);
Run Code Online (Sandbox Code Playgroud)

Stackblitz