Подписка на несколько наблюдаемых последовательно с помощью Rxjs - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь сделать http-запрос только , когда моя форма грязная. Я пробовал использовать zip, но он все равно будет выполнять HTTP-запрос, несмотря на то, что результаты канала будут применяться только к блоку подписки. Есть ли у меня способ NOT вложить наблюдаемые объекты, так как я должен подписаться на другой наблюдаемый объект после http-вызова, который приведет к 3 вложенным слоям наблюдаемого.

  @ViewChild('form') 
  form: NgForm;

  // only take events when form is dirty
  const formValueChanges$ = this.form.valueChanges
    .pipe(
      debounceTime(500),
      filter(() => this.form.dirty),
      takeUntil(this._destroy$),
      distinctUntilChanged(),
      tap(result => {
        console.log(result);
      })
    );

  // http request returning an observable
  const updateForm$ = this.tempService.update();

  zip(formValueChanges$, updateForm$)
    .subscribe((response) => {
        console.log(response);
      }
    );

Предполагаемое поведение

this.form.valueChanges
  .pipe(
     debounceTime(500),
     filter(() => this.form.dirty),
     takeUntil(this._destroy$),
     distinctUntilChanged(),
  ).subscribe(() => {
     console.log("SAVED");
     this.tempService.update().subscribe();
  });

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Вы можете go для оператора mergeMap из rx js.

0 голосов
/ 29 мая 2020

Вы можете использовать оператор concatMap , чтобы быть уверенным в порядке, concatMap будет ждать завершения предыдущего HTTP Observable перед отображением нового значения из формы.

this.form.valueChanges
 .pipe(
  debounceTime(500),
  filter(() => this.form.dirty),
  takeUntil(this._destroy$),
  distinctUntilChanged(),
  concatMap(val => this.tempService.update())
).subscribe(console.log);
...