我正在尝试找出RxJ。特别是ShareReplay运算符。根据我的理解,如果对一个可观察对象有两个订阅,那么该可观察对象应该执行两次。除非涉及到shareReplay。显然我的理解是错误的,因为这不是我在这里发生的事情。有人可以帮我理解吗?
export class TestComponent implements OnInit {
constructor() {}
i = 0;
ngOnInit() {
console.clear();
let ob = this.httpcall().pipe(map(d => d));
let ob1$ = ob.pipe(map(d => d.toUpperCase()));
let ob2$ = ob.pipe(map(d => d.toLowerCase()));
ob1$.subscribe(d => {
console.log(d);
});
ob2$.subscribe(d => {
console.log(d);
});
}
httpcall() {
console.log("called");
this.i++;
return of("server cAlled:" + this.i);
}
}
输出:
called
SERVER CALLED:1
server called:1
即使有两个订阅并且不涉及shareReplay,我的计数器也没有增加到两个。
我期待(没有shareReplay):
called
SERVER CALLED:1
called
server called:2
我期望使用
let ob = this.httpcall().pipe(map(d=>d),shareReplay());
: called
SERVER CALLED:1
server called:1
最佳答案
当您调用订阅时,这将导致可观察对象执行其定义要执行的所有操作。它是使用of("server cAlled: 1");
定义的,然后将其传递给地图运算符。因此,由于您订阅了两次,所以of
将执行两次,而map
将执行两次。
您碰巧在名为httpcall的函数中创建了可观察对象,但是该可观察对象对httpcall一无所知。 httpcall将不会再被调用。
如果希望this.i的增加成为预订时发生的事情的一部分,则可能需要使用Observable.create。例如:
httpcall() {
return Observable.create((observer) => {
this.i++;
observer.next("server called: " + this.i);
observer.complete();
})
}
关于javascript - 为什么没有shareReplay()的两个可观察对象的订阅不会执行两次代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56976806/