- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图找出 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/
我正在尝试使用 RxJS 重写包管理器(PM 是 pnpm ,PR 是 here )。 在重写过程中,我使用了很多 .shareReplay(Infinity),有人告诉我这很糟糕(我是响应式(Rea
例如: const s = rxjs.interval(2000).pipe(tap(console.log), shareReplay(1)) const b = s.subscribe(v =>
在下面的代码中,我创建了一个简单的可观察对象,它产生一个值然后完成。然后我分享那个可观察的重播最后一个项目并订阅 3 次。紧随其后的第一次,第二次在产生值(value)之前,第三次在产生值(value
我看过 RxSwift/ShareReplayScope.swift 文件,但有点难以理解。 public func share(replay: Int = 0, scope: SubjectLife
问题在于 startWith 和 shareReplay 结合得不好。 如果您使用 source.startWith(0).shareReplay(1),新订阅将始终以 0 开头,并且 shareRe
我试图找出 RxJs。特别是 ShareReplay 运算符。根据我的理解,如果有两个对 observable 的订阅,那么 observable 应该被执行两次。除非涉及 shareReplay。显
我正在为从 API 检索的某些数据使用缓存,出于逻辑原因,存储的数据仅在有限的时间内有效,因此我正在使用以下内容: someApiData$ = this.getData() .pipe(sh
我不明白什么bufferSize参数意味着什么,它有什么影响。 以下有什么区别? var published = source .shareReplay(); var published =
我使用 shareReplay 只调用一次(像缓存一样)网络服务来检索一些信息: 在我的服务中: getProfile(): Observable { return this.callWS()
我已经知道了 publish 共享一个订阅并返回一个 ConnectableObservable(因此我们必须 Connect()) Share() 是 publish().refcount() Re
我有一个场景,比如我需要在单击文件时获取文件内容。我想用shareReplay()缓存文件内容API,如何实现? fileService.getContent 是一个 API 服务,它将使用 para
在这两个例子中,subject$以完全相同的方式行事? import { BehaviorSubject, Observable } from 'rxjs'; let source: Observab
我已经开始使用 RxJS5,现在发现不再有 shareReplay 方法。 很有可能我经常在 RxJS4 中误用 shareReplay,但现在我正在努力获得我想要的行为,即: 创建一个可观察对象 订
我有一个外部热源在观察者可以订阅之前推送值。订阅后,迟到的观察者应该收到最新的值以及从那时起的每个值。为此,我使用了以下代码(相关行标有“ console.warn('!!!', n)); 这行不通(
export class DataService { private readonly dataSubject: Subject = new Subject(); public readonl
我一直在寻找一种在 Angular 中缓存 HTTP 数据的方法,最后我决定使用 .shareReplay() 来实现它。此外,我想手动清除缓存或每当此 ReplaySubject 过时时清除它,因为
对不起,如果这是一个明显的问题。 我正在关注本教程:https://blog.angular-university.io/angular-jwt-authentication/ 我在教程中创建了服务,
所以我希望能够懒惰地订阅共享数据,而不会在没有人订阅时持续存在。然后如果有人再次订阅,将创建一个新的可观察对象。我会使用一个变量,但如果没有人订阅,我不希望它持续存在(因为如果我使用数组或大于 int
我正在使用 RxJS shareReplay()可观察对象( courses$ )上的运算符,以在其他两个可观察对象( beginnerCourses$ 和 advancedCourses$ )之间共
我创建了一个演示 ( ng-run ),其中有一个调用 Http 请求的按钮。 单击按钮时,我调用此方法: public getData(){ this._jokeService.getData()
我是一名优秀的程序员,十分优秀!