我将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 => {
....
正如其他用户所建议的那样,虽然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中是否可以创建这