[英]How to transform properties in a RXJS Observable
我必須在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)
);
first: John_test
second: John_test
first: John_test
second: John_test_test
這是因為您要兩次修改同一對象實例。 當地圖返回該對象的副本時,將不會發生。 嘗試這個:
const personObservable = source.pipe(
map(person => ({
...person,
name: person.name + '_test'
})),
);
您還可以將shareReplay
運算符與原始映射功能一起使用:
const personObservable = source.pipe(
map(person => {
person.name = person.name + '_test'; return person;
}),
shareReplay()
);
另一個解決方案是使用Observable.create
或new Observable()
創建您的Observable。
of
建立組播觀察到。 new Observable
將創建一個冷的單播Observable,它為每個Observer發出一個新的對象實例。
const source = new Observable((subscriber) => {
subscriber.next({ id: 1, name: 'John' });
subscriber.complete();
});
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)
);
工作StackBlitz:
https://stackblitz.com/edit/angular-bdhjuo
我最近還寫了一篇文章,解釋了熱和冷的Observables,您可能會發現它很有用:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.