Рефакторинг combinelatest для rxjs

Я пытаюсь реорганизовать свой код с rxjs 5.x на rxjs 6 и Angular 6. У меня был код, который по сути запускает поиск:

  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.info("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.info("Search Box Obersable : ", value);

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

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


      })


    });

  }//End of ngOnInit

Однако это, похоже, не помогло, и поиск больше не запускается. Мне было интересно, как на самом деле рефакторинг этого кода для работы с rxjs 6?

Просто замените Observable.combineLatest на combineLatest в исходном коде и импортируйте combineLatest из rxjs. rxjs-dev.firebaseapp.com/api/index/function/combineLatest. Вам также следует узнать об операторе switchMap вместо подписки внутри подписки.

JB Nizet 31.07.2018 19:01

Спасибо, я думал, что генерирую наблюдаемое через Observable. Это имеет смысл.

user3836415 01.08.2018 03:10
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете оператор 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.create() сам по себе ничего не излучает, поэтому combineLatest тоже не излучает.

Вместо этого вы должны использовать только следующее:

import { combineLatest } from 'rxjs';

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

Другие вопросы по теме