繁体   English   中英

Angular, 2 科目, combineLatest 不工作

[英]Angular, 2 subjects, combineLatest not working

  $query: Subject<string> = new Subject();
  $order: Subject<string> = new Subject();

  constructor() {
    combineLatest([this.$query, this.$order]).pipe(
      debounceTime(300),
      startWith([null, 'Oldest'])
    ).subscribe(([query, order]) => {
      console.log('query', query);
      console.log('order', order);
    });  
  }

日志只显示一次,在我尝试调用$query.next('sthg')之后,它不起作用。

有人知道为什么吗? 如果$query$order获得新值,我想记录这些值。 最新的组合不能与主题一起使用吗?

所有源 Observable 都需要至少发出一次,因此您可以使用它:

combineLatest([
  this.$query.pipe(startWith(null)),
  this.$order.pipe(startWith("Oldest")),
]).pipe(
  debounceTime(300),
)
.subscribe(...);

这样,您将获得您期望的第一个发射,然后它应该在每次更改时发射。

根据文档,为了使其工作,两个可观察对象必须发出至少一个值。 你可以尝试这样的事情:

  combineLatest([this.$query, this.$order.pipe(startWith("Oldest")]).pipe(
    debounceTime(300),
  ).subscribe(([query, order]) => {
    console.log('query', query);
    console.log('order', order);
  });

然后,当您调用$query.next('sthg')时,您应该会看到控制台日志。

来自combineLatest (learnrxjs.io)

请注意,在每个 observable 发出至少一个值之前, combineLatest 不会发出初始值 这与 withLatestFrom 的行为相同,并且可能是一个陷阱,因为不会有 output 并且没有错误,但是您的一个(或多个)内部可观察对象可能无法按预期运行,或者订阅延迟。

我个人使用BehaviorSubject作为源并添加filter pipe 以逃避不需要的组合:

combineLatest([this.obs1$, this.obs2$, this.obs3$])
    .pipe(
      filter((result) => {
        let valueObs1 = result[0];
        let valueObs2 = result[1];
        let valueObs3 = result[2];

        if (logic tgo escape) 
             return false;

        return true;
      })
    )
    .subscribe(
      (result) => console.log(result),
      (error) => console.log(error)
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM