Observable create被调用两次

时间:2017-07-03 10:59:36

标签: javascript ionic-framework rxjs observable

我正在使用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.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 => {
                     ....

1 个答案:

答案 0 :(得分:4)

正如其他用户所建议的那样,虽然findChats只被调用一次,但它似乎返回的observable多次订阅。 create返回一个cold observable,它将导致为每个订阅执行所有内部逻辑。您可以在整个事情的最后(即share调用之外/之后)敲击create来测试这个,但我建议如果您不使用{{ 1}},而不仅仅是映射/ flatMapped / switchMapped您的原始流到您想要的流(以避免手动订阅管理)。