我需要订阅3个订阅。但是,当我运行它时,只有3个中的1个或2个会被触发。我什至尝试交换订阅的顺序,最后一个仍然没有被触发。我还尝试在角度组件的constructor
和ngOnInit()
中运行它们。我得到相同的答复。
尝试1:
this.n.authorizations.subscribe(x => {
alert("1"); // ✅
this.n.pages.subscribe(y => {
alert("2"); // ❌
this.n.user.subscribe(user => {
alert("3"); // ❌
});
});
});
尝试2:
this.n.pages.subscribe(y => {
alert("1"); // ✅
this.n.authorizations.subscribe(x => {
alert("2"); // ✅
this.n.user.subscribe(user => {
alert("3"); // ❌
});
});
});
尝试3:
this.n.user.subscribe(user => {
alert("1"); // ✅
this.n.authorizations.subscribe(x => {
alert("2"); // ✅
this.n.pages.subscribe(y => {
alert("3"); // ❌
});
});
});
我确实有这些服务的代码,但是它们又长又复杂。可能与问题无关。
答案 0 :(得分:1)
从您遵循的方法来看,似乎任何订阅都不依赖于其他订阅。
因此,在这种情况下,为什么不 forkJoin
,然后subscribe
加入联接的Observable。
import { forkJoin } from 'rxjs';
...
const combined = forkJoin(
this.n.user,
this.n.authorizations,
this.n.pages
);
...
combined.subscribe(
[user, auths, pages] => console.log(user, auths, pages),
error => console.log(error),
() => console.log('Combined Completed')
);
答案 1 :(得分:0)
我发现了问题(种类)。第一次尝试时,pages
的订阅发生在pages
可观察到的解析之后。因此,我将该服务函数中的返回对象更改为ReplaySubject
而不是Subject
,这导致后来的订阅者获得了发出的最新值。我不知道这一切是怎么发生的,但这解决了我的问题。但这没有道理。
编辑:正如另一位用户建议的那样,在这种情况下,BehaviorSubject会更好。
答案 2 :(得分:0)
在我看来,您正在连锁不应该被连锁的事物。
this.n.user.subscribe(user => {
alert("1");
});
this.n.authorizations.subscribe(x => {
alert("2");
});
this.n.pages.subscribe(y => {
alert("3");
});
像您一样订阅时,您的内部订阅甚至没有附加 ,直到您的外部订阅获得其第一个价值。