嵌套角订阅不触发

时间:2018-11-09 19:33:44

标签: angular rxjs

我需要订阅3个订阅。但是,当我运行它时,只有3个中的1个或2个会被触发。我什至尝试交换订阅的顺序,最后一个仍然没有被触发。我还尝试在角度组件的constructorngOnInit()中运行它们。我得到相同的答复。

尝试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"); // ❌
        });
    });
});

我确实有这些服务的代码,但是它们又长又复杂。可能与问题无关。

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");
});

像您一样订阅时,您的内部订阅甚至没有附加 ,直到您的外部订阅获得其第一个价值。