一个完整的可观察物会发生什么?如果我订阅了完整的可观察物怎么办?

时间:2019-01-03 16:42:46

标签: angular rxjs

我很难找到Observable完成时会发生什么。我有一个可观察到的东西,必须要做其他工作才能完成。为此,我的其他函数订阅了该可观察的消息,当它完成时,它们便开始工作。

我的问题是,当他们在可观察对象完成订阅后,会发生什么?根据我的测试,似乎它们获得了最后一个值,然后完成了(它在value方法上触发completesubscribe回调)。如果它已经完成,我宁愿不订阅它。

有没有一种方法可以检查Observable是否已完成而无需订阅?我在完成时未设置其未定义状态,但是如果我从另一个函数中订阅了Observable,则会产生问题

我可以创建一个行为主题isLoaded,该行为主题以False开头,并在完成后变为true,但是我在查找有关完成的可观察对象在订阅时的行为以及最佳实践的文档方面遇到了麻烦是。谢谢!

编辑:这不是在询问如何检查可观察对象是否完整。它询问如果可观察项是否从其他订阅中完成,会发生什么情况,您如何检查它是否已完成。当可观察对象完成并查看可观察对象时,会发生什么情况。

2 个答案:

答案 0 :(得分:1)

默认情况下,observable表现为单播。与功能相同,单播表示与订阅的比例为1:1。想像一下您可以想到的最简单的功能:

function boo() { //do something }
boo();

您需要调用函数来触发某些操作。同样适用于可观察-

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

someObservable.subscribe(...);

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

现在还有另一种可观察的multicast-通常在Subject的实现中表示。无论订阅是否存在,它都会发出,并且您可以检查它是否为closed来发现源本身已经关闭。根据主题的性质,您可能会观察到不同的行为,通常,尝试订阅多播可观察对象的内容时,您一无所获。

答案 1 :(得分:0)

如果您不使用 endWith 运算符,它将不再发出任何值,但是如果提供它,它会触发 complete 回调。尚未使用 finalize 运算符对其进行测试,但我想它也会被触发,因为 observable 每次订阅时都会经历相同的生命周期。

如果使用了 endWith 运算符,那么它的值将在每个订阅完成后发出。

使用 RxJS v.7.1.0