我正在尝试找出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/

10-11 11:41