重构rxjs的Combinelatest

时间:2018-07-31 16:43:06

标签: angular rxjs rxjs6

我正在尝试将我的代码从rxjs 5.x重构到rxjs 6和Angular6。我有一个实质上触发搜索的代码:

  startAt = new Subject();
  endAt = new Subject();

  startobs = this.startAt.asObservable();
  endobs = this.endAt.asObservable();

  constructor() {}

  ngOnInit(){

    var that = this;

    Observable.combineLatest(this.startobs, this.endobs)
    .subscribe((value) => {
      this.acctServ.searchAccounts(value[0], value[1])
      .subscribe((accounts) => {
console.log("accounts : ", accounts);
          });


      })


    });
  }

为了进行重构,我做了以下工作:

startAt = new Subject();
  endAt = new Subject();

  startobs = this.startAt.asObservable();
  endobs = this.endAt.asObservable();

  constructor() { 

  }//End of Constructor

  ngOnInit() {

    Observable.create().pipe(combineLatest(this.startobs, this.endobs))
    .subscribe((value) => {
      console.log("Search Box Obersable : ", value);

      this.acctServ.searchAccounts(value[0], value[1])
      .subscribe((accounts) => {

        console.log("accounts : ", accounts);
          });


      })


    });

  }//End of ngOnInit

但是,这似乎没有帮助,搜索也不再触发。我想知道如何真正重构此代码以与rxjs 6一起使用?

1 个答案:

答案 0 :(得分:4)

您正在使用从combineLatest导入的"rxjs/operators"运算符,而应使用从combineLatest导入的"rxjs"创建方法:

您现在拥有的Observable.create().pipe(combineLatest(this.startobs, this.endobs))与以下内容相同:

import { combineLatest } from 'rxjs';

combineLatest(Observable.create(), this.startobs, this.endobs)
  ...

这将永远不会发出任何东西,因为combineLatest要求所有源Observable都发出至少一个值。但是Observable.create()本身不会发出任何东西,因此combineLatest也不会发出任何东西。

相反,您应该只使用以下内容:

import { combineLatest } from 'rxjs';

combineLatest(this.startobs, this.endobs)
  ...