gpt4 book ai didi

javascript - 为什么在没有 shareReplay() 的情况下对可观察对象的两次订阅不会执行代码两次?

转载 作者:行者123 更新时间:2023-11-30 13:57:27 26 4
gpt4 key购买 nike

我试图找出 RxJs。特别是 ShareReplay 运算符。根据我的理解,如果有两个对 observable 的订阅,那么 observable 应该被执行两次。除非涉及 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,计数器 i 也没有增加到两个。

我期待(没有 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

最佳答案

当您调用 subscribe 时,这将导致 observable 执行它定义的所有操作。它是使用 of("server cAlled: 1"); 定义的,然后传递给 map 运算符。因此,由于您订阅了两次,of 将执行两次操作,而 map 将执行两次操作。

您碰巧在名为 httpcall 的函数中创建了 observable,但 observable 对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com