【问题标题】:Observable create is called twiceObservable create 被调用两次
【发布时间】:2017-12-06 14:57:06
【问题描述】:

我正在使用带有rxjs/Observable 的 Ionic3。我有以下函数,由于某种原因,即使该函数只被调用一次,第三行也会被触发两次。

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.chatSubscription2 正在获取第二个订阅的价值,而第一个订阅丢失了,不允许我取消订阅。

line 2 is executed once
line 3 is executed twice

问题

如何创建一个只有一个订阅的Observable

谢谢

更新

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

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

【问题讨论】:

  • 制作const obs$ = findChats().share(),然后只订阅obs$.subscribe(...)
  • 谢谢马丁,但是:[ts] Property 'share' does not exist on type 'Observable&lt;any[]&gt;'
  • 谢谢,我现在可以使用shar(e),但是还是不行,我可能实现不正确。请参阅上面的 UPADTE。
  • 你有没有碰巧在其他地方打电话给this.chatSubscription2.subscribe()

标签: javascript ionic-framework rxjs observable


【解决方案1】:

正如其他用户所建议的,虽然 findChats 只被调用一次,但它返回的 observable 似乎被订阅了多次。 create 返回一个冷的 observable,它将导致为每个订阅执行所有内部逻辑。你可以在整个事情的最后敲一个share(即在create调用之后)来测试这个,但我建议如果你根本不使用create,解决方案实际上会更简单,而只是将您的原始流映射/flatMapped/switchMapped 到您想要的流中(以避免手动订阅管理)。

【讨论】:

  • 谢谢你,你是对的。 share() 解决了我的问题。但正如你所建议的,我会尝试折射我的代码不使用create
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2016-04-01
  • 2012-05-05
  • 2017-01-19
  • 2014-02-04
  • 2016-12-13
相关资源
最近更新 更多