首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重置BehaviorSubject

如何重置BehaviorSubject
EN

Stack Overflow用户
提问于 2017-08-30 12:12:42
回答 6查看 53.4K关注 0票数 32

我有一个BehaviorSubject,我想要重置-我的意思是,我希望最新的价值不可用,就像它是刚刚创建的。

我似乎没有看到一个API来做到这一点,但我想还有另一种方法可以实现同样的结果吗?

我想要的行为是,我需要发出事件,如果某个特定的管理器处于“已启动”状态,我希望订阅者在订阅时获得最新的事件。但是,当这个管理器被“停止”时,最新的事件就不应该可用了(就像它从一开始就没有启动一样)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-08-30 16:35:25

我假设您希望清除BehaviorSubject (因为否则不会调用onComplete )。这是不支持的,但是您可以通过拥有一个被使用者忽略的当前值来实现类似的效果:

代码语言:javascript
复制
public static final Object EMPTY = new Object();

BehaviorSubject<Object> subject = BehaviorSubject.createDefault(EMPTY);

Observable<YourType> obs = subject.filter(v -> v != EMPTY).cast(YourType.class);

obs.subscribe(System.out::println);

// send normal data
subject.onNext(1);
subject.onNext(2);

// clear the subject
subject.onNext(EMPTY);

// this should not print anything
obs.subscribe(System.out::println);
票数 28
EN

Stack Overflow用户

发布于 2017-09-04 17:57:57

切换可观测开关值的另一种方法是使用switchMap()在实际可观测值和空值之间切换。

让我们假设您有一个manager对象,并且它有一个可观察的、显示其状态的对象。然后,

代码语言:javascript
复制
subjectObservable = manager.getStateObservable()
  .switchMap( state -> state == ON ? subject : Observable.never() );

只有在manager处于ON状态时才会发出值。

票数 14
EN

Stack Overflow用户

发布于 2018-10-10 17:05:28

只需像这样使用setTimeout:

代码语言:javascript
复制
setOtpoint(value) {

    this._setOption.next(value);

    // Clear BehaviorSubject after emit value

    setTimeout(() => {
      this._setOption.next(null);
    }, 100);

  }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45960121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档