【发布时间】:2021-02-03 09:20:36
【问题描述】:
我将BehaviourSubject 纯粹用作触发器,因此有效负载无关紧要。主题应该在订阅时“触发”(致电next)(简单的Subject 行不通!)。原则上,为此目的使用BehaviourSubject<void> 就足够了:
const readonly trigger = new BehaviourSubject<void>()
^^
must not be empty
但是,创建这样一个主题似乎是不可能的。或者有没有办法在没有初始值的情况下创建void 类型的BehaviourSubject?
【问题讨论】:
-
当然,有效载荷无关紧要,但必须有有效载荷。您还能如何区分不发射的流和不发射的流?这两件事看起来一样。考虑任何其他信号。 “当我说 'BERRY' 时,你就开始了比赛”——当然不管你用什么词,但因此说“当我什么都没说时”是没有意义的,然后你开始比赛。”那确实是一个非常糟糕的信号。 - 我会选择一个布尔值或空值(小内存占用)并使用它。
-
@MrkSef 不,不一定有有效载荷。即使没有值,观察者也会被通知发生了某事,因为将调用观察者的
next方法。见StackBlitz exmple -
undefined是一个有效载荷。在 javascript 中,未初始化的值实际上具有值undefined。undefined是原始类型。听起来很奇怪,您正在使用undefined初始化您的 BehaviorSubject。使用undefined调用您将参数传递给订阅的 Lamba。 -
确实如此。但对我来说重要的是避免使用甚至可能被误解的无用值调用
next(因为有人看到了值本身的含义)。然后next上没有payload。 -
在我看来 null 在这种情况下在语义上非常清楚。如果你尝试`trigger.next()
. It should say something likenext` 需要 1 个参数并且你输入了 0,Typescript 也会抱怨。所以你也会在那里做类似 trigger.next(null) 的事情。在 Javascript 中,trigger.next()与trigger.next(undefined)相同,所以如果你想让 typescript 编译器满意,同时让它感觉最接近没有参数的普通 JS 函数调用,那么undefined可能是票。
标签: javascript typescript rxjs behaviorsubject