RxJS:如何不订阅初始值和/或未定义?

Pip*_*ipo 40 javascript rxjs

作为RxJS的新手我经常创造一个在未来拥有价值的主题,但最初是undefined.这可能是undefined第一次.我目前使用a filter跳过undefined值,但这是非常麻烦的,因为我在任何地方都这样做,因为我只需要一次.(也许我在这里做错了什么?)mySubject只有在它获得第一个值之后才能以某种方式订阅onNext吗?

var mySubject = new Rx.BehaviorSubject(undefined);

mySubject.filter(function(value) {
  return value !== undefined;
}).subscribe(function(value) {
  // do something with the value
});
Run Code Online (Sandbox Code Playgroud)

Bra*_*don 41

new Rx.ReplaySubject(1)而不是BehaviorSubject.

  • 这不再是一个强相关; 从RxJS 5开始,`ReplaySubject`在首次回答这个问题时丢失了`BehaviorSubject`的几个方面.例如,如果您真的需要同步快照值,则可以使用`.skip(1)`(/sf/answers/3141893261/)或订阅自己的缓存.另请注意,完成时的功能已更改. (4认同)
  • 再次感谢你。第三次...?我*阅读* RxJS文档和一些指南,但是有时确实很难找到解决某个问题的解决方案。 (2认同)
  • 如果您不想要过时的值,请使用Subject.当你*需要一个过时的值时,ReplaySubject操作系统.与BehaviorSubject不同,它可以在没有起始值的情况下构建 (2认同)
  • ReplaySubject(1) 对我有用,无需跳过。我需要它,因为,我可能最终会在调用 .next(...) 后订阅主题(准异步函数通过可观察的返回单个对象)。也许我应该只使用最基本的 Promise 来代替? (2认同)

lwo*_*art 13

正如Will所提到的,你应该能够通过使用skip运算符跳过第一个值:

var mySubject = new Rx.BehaviorSubject(undefined);

mySubject.skip(1).subscribe(function(value) {
  // do something with the value
});
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的问题在于,如果在发出第一个实数值之后进行`subscribe`调用,它将跳过有效值. (12认同)
  • @Simon_Weaver取决于您的用例。如果您只想在订阅时接收“未来”值,则此方法有效。如果您要在订阅时接收最新的“过去”值,则不会。很难说出OP想要哪种用例,但是当我遇到这个问题时,我肯定想要后者。 (2认同)

小智 5

mySubject.pipe( skipWhile( v => !v ) );