一个完整的可观察对象会发生什么?如果我订阅一个已完成的可观察对象怎么办?

Die*_*sel 7 rxjs angular

我无法确定 Observable 完成后会发生什么情况。我有一个必须在做其他工作之前完成的可观察对象。为此,我的其他函数会订阅该可观察对象,当它完成时,它们就会开始工作。

我的问题是,当他们在Observable 完成后订阅时会发生什么?从我的测试来看,他们似乎获得了最后一个值,然后完成(它触发valuecomplete回调该subscribe方法)。如果它已经完成,我宁愿不订阅它。

有没有办法在不订阅的情况下检查 Observable 是否已完成?完成后我将其设置为未定义,但如果发生这种情况时我从另一个函数订阅了可观察的内容,则会产生问题。

我可以创建一个行为主题isLoaded,该主题一开始为 False,完成后变为 true,但我无法找到有关已完成的可观察对象在订阅时执行的操作以及最佳实践是什么的文档。谢谢你!

编辑:这并不是询问如何检查可观察对象是否完整。它询问的是,如果可观察对象从不同的订阅完成,会发生什么,以及如何检查它是否已完成。当可观察对象完成并且您查看可观察对象时,会发生什么。

小智 4

默认情况下,observable 的行为是单播的。单播意味着它与订阅是1:1的关系,就像函数一样。想想你能想到的最简单的函数,如下所示:

function boo() { //do something }
boo();
Run Code Online (Sandbox Code Playgroud)

您需要调用函数来触发某些内容。同样适用于可观察到的 -

const someObservable = of(1,2,3);

someObservable.subscribe(...);
Run Code Online (Sandbox Code Playgroud)

someObservable在您订阅之前不执行任何操作。因此,检查它是否完成是没有意义的,因为您没有订阅任何内容。另外,检查其他订阅是否完成也没有任何意义,因为它与订阅是 1:1 的关系。您可以检查订阅的状态,但这与完成状态不同。

现在还有其他类型的 observable,multicast- 通常在Subject. 无论订阅是否存在,都会发出信号,您可以检查它是否closed已关闭以查找源本身。根据主题的性质,您可能会观察到不同的行为,通常当尝试订阅已完成的多播可观察量时,您什么也得不到。