当前位置: 首页 > 知识库问答 >
问题:

可观察创建被调用两次

万俟浩
2023-03-14

我将Ionic3与一个rxjs/Observable一起使用。我有下面的函数,出于某种原因,即使该函数只被调用一次,第三行也会被触发两次。

findChats(): Observable<any[]> {
    return Observable.create((observer) => {
        this.chatSubscription2 = this.firebaseDataService.findChats().subscribe(firebaseItems => {
            this.localDataService.findChats().then((localItems: any[]) => {
                let mergedItems: any[] = [];
                if (localItems && localItems != null && firebaseItems && firebaseItems != null) {
                    for (let i: number = 0; i < localItems.length; i++) {
                        if (localItems[i] === null) {
                            localItems.splice(i, 1);
                        }
                    }
                    mergedItems = this.arrayUnique(firebaseItems.concat(localItems), true);
                } else if (firebaseItems && firebaseItems != null) {
                    mergedItems = firebaseItems;
                } else if (localItems && localItems != null) {
                    mergedItems = localItems;
                }
                mergedItems.sort((a, b) => {
                    return parseFloat(a.negativtimestamp) - parseFloat(b.negativtimestamp);
                });
                observer.next(mergedItems);
                this.checkChats(firebaseItems, localItems);
            });
        });
    });
}

问题

这引起了一个问题,因为this.chatSubcription2正在获取第二个订阅的值,并且第一个订阅丢失,不允许我取消订阅。

line 2 is executed once
line 3 is executed twice

问题

如何创建一个只有一个订阅的可观察的

谢啦

使现代化

我使用share()将代码更改为以下内容,但第3行仍然会执行两次:

findChats(): Observable<any[]> {
    return Observable.create((observer) => {
        const obs = this.firebaseDataService.findChats().share();
        this.chatSubscription2 = obs.subscribe(firebaseItems => {
                     ....

共有1个答案

张卓
2023-03-14

正如其他用户所建议的那样,虽然findChats只被调用一次,但它返回的可观察内容似乎被多次订阅create返回一个cold observable,它将导致为每个订阅执行所有内部逻辑。您可以在整个过程结束时(即在create调用之外/之后)敲打share,以测试这一点,但我建议,如果您根本不使用create,解决方案实际上会更简单,而只是映射/平面映射/切换将原始流映射到所需流中(以避免手动订阅管理)。

 类似资料:
  • 我试图理解当我使用 在或之后,在我使用时返回true 我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。

  • 我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot

  • 假设我有一个,它从网络获取数据并发出数据,如果我订阅这个observable,每次它试图从网络请求数据时,它会很重。 我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都将订阅BehaviorSubject以获取最新发出的数据。 到目前为止,我还不能用它来编码。我不能创建空的BehaviorSubject并在observableA内调用,因为它们彼此不

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 我想调用一个函数(同步),然后使用它的返回值作为初始发射(随后链接一些其他运算符上的结果可观察)。 我想在订阅期间调用这个函数,所以我不能只使用

  • 我需要使用以下规则将两个可观察到的东西A和B组合起来: 组合可观察物的类型必须是 A可以多次发射或不发射 B可能发射1次或不发射 只要B没有发射任何东西,组合的可观测物就不会发射任何东西。 当B发射时,如果A已经发射,则A的最后结果将由组合可观测器发射。如果A尚未发出,将发出。 我尝试过使用,但是如果A还没有发出,这就不起作用了。我还尝试了并执行,但我无法从转换为 在RXJava2中是否可以创建这