【问题标题】:Is it possible to create BehaviourSubject<void>() without initial value?是否可以在没有初始值的情况下创建 BehaviourSubject<void>() ?
【发布时间】:2021-02-03 09:20:36
【问题描述】:

我将BehaviourSubject 纯粹用作触发器,因此有效负载无关紧要。主题应该在订阅时“触发”(致电next)(简单的Subject 行不通!)。原则上,为此目的使用BehaviourSubject&lt;void&gt; 就足够了:

const readonly trigger = new BehaviourSubject<void>()
                                                   ^^
                                                   must not be empty

但是,创建这样一个主题似乎是不可能的。或者有没有办法在没有初始值的情况下创建void 类型的BehaviourSubject

【问题讨论】:

  • 当然,有效载荷无关紧要,但必须有效载荷。您还能如何区分不发射的流和不发射的流?这两件事看起来一样。考虑任何其他信号。 “当我说 'BERRY' 时,你就开始了比赛”——当然不管你用什么词,但因此说“当我什么都没说时”是没有意义的,然后你开始比赛。”那确实是一个非常糟糕的信号。 - 我会选择一个布尔值或空值(小内存占用)并使用它。
  • @MrkSef 不,不一定有有效载荷。即使没有值,观察者也会被通知发生了某事,因为将调用观察者的next 方法。见StackBlitz exmple
  • undefined 是一个有效载荷。在 javascript 中,未初始化的值实际上具有值undefinedundefined 是原始类型。听起来很奇怪,您正在使用 undefined 初始化您的 BehaviorSubject。使用 undefined 调用您将参数传递给订阅的 Lamba。
  • 确实如此。但对我来说重要的是避免使用甚至可能被误解的无用值调用next(因为有人看到了值本身的含义)。然后next上没有payload。
  • 在我看来 null 在这种情况下在语义上非常清楚。如果你尝试`trigger.next(). It should say something like next` 需要 1 个参数并且你输入了 0,Typescript 也会抱怨。所以你也会在那里做类似 trigger.next(null) 的事情。在 Javascript 中,trigger.next()trigger.next(undefined) 相同,所以如果你想让 typescript 编译器满意,同时让它感觉最接近没有参数的普通 JS 函数调用,那么undefined 可能是票。

标签: javascript typescript rxjs behaviorsubject


【解决方案1】:

显然Subject 不能满足您的需求,因为您希望触发订阅。您可以将初始值设置为 undefined 虽然...

new BehaviorSubject<void>(undefined)

null 也应该可以正常工作。

【讨论】:

  • 谢谢,undefined 有效。 null 没有,至少在 TypeScript 严格模式下没有。
猜你喜欢
  • 2014-06-16
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2013-08-21
  • 2021-04-07
  • 2023-02-11
  • 2019-03-11
相关资源
最近更新 更多