Angular RxJS - 无法使冷的 observable 变热
Angular RxJS - fail to make cold observable hot
代码:
const cold = new Observable((observer: Observer<any>) => {
observer.next(Math.random());
});
const hot = cold.pipe(share());
hot.subscribe(a => console.log('a: ' + a));
hot.subscribe(b => console.log('b: ' + b));
}
预期结果 - a 和 b 具有相同的值:
//一个:0.17919353301075858
// b: 0.17919353301075858
实际结果-只在浏览器控制台获取a的值:
//一个:0.07958207844185083
有什么想法吗?
您可以尝试 shareReplay(1)
来 重播 最后一个值
https://www.learnrxjs.io/learn-rxjs/operators/multicasting/sharereplay
还有一篇好文章:https://itnext.io/the-magic-of-rxjs-sharing-operators-and-their-differences-3a03d699d255
你可以使用像 interval
这样的热 observable 和 map
operator
import { interval } from 'rxjs';
import { map } from 'rxjs/operators';
const source = interval(1000).pipe(map(() => Math.random()));
const subscribe = source.subscribe(val => console.log(val));
已更新
您可以使用 multicast
运算符和 ReplaySubject
const source: any = interval(1000)
.pipe(
take(10),
map(() => Math.random())
)
.pipe(multicast(new ReplaySubject()));
source.connect();
source.subscribe(val => console.log(1, val));
source.subscribe(val => console.log(2, val));
代码:
const cold = new Observable((observer: Observer<any>) => {
observer.next(Math.random());
});
const hot = cold.pipe(share());
hot.subscribe(a => console.log('a: ' + a));
hot.subscribe(b => console.log('b: ' + b));
}
预期结果 - a 和 b 具有相同的值:
//一个:0.17919353301075858
// b: 0.17919353301075858
实际结果-只在浏览器控制台获取a的值:
//一个:0.07958207844185083
有什么想法吗?
您可以尝试 shareReplay(1)
来 重播 最后一个值
https://www.learnrxjs.io/learn-rxjs/operators/multicasting/sharereplay
还有一篇好文章:https://itnext.io/the-magic-of-rxjs-sharing-operators-and-their-differences-3a03d699d255
你可以使用像 interval
这样的热 observable 和 map
operator
import { interval } from 'rxjs';
import { map } from 'rxjs/operators';
const source = interval(1000).pipe(map(() => Math.random()));
const subscribe = source.subscribe(val => console.log(val));
已更新
您可以使用 multicast
运算符和 ReplaySubject
const source: any = interval(1000)
.pipe(
take(10),
map(() => Math.random())
)
.pipe(multicast(new ReplaySubject()));
source.connect();
source.subscribe(val => console.log(1, val));
source.subscribe(val => console.log(2, val));