【发布时间】: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<any[]>' -
谢谢,我现在可以使用
shar(e),但是还是不行,我可能实现不正确。请参阅上面的 UPADTE。 -
你有没有碰巧在其他地方打电话给
this.chatSubscription2.subscribe()?
标签: javascript ionic-framework rxjs observable