как подписаться в условном результате подписки - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь выполнить 3 асинхронных действия (наблюдаемые), одно внутри другого. 1. Первым наблюдаемым является ответ модального диалогового окна eventEmiter - остальная часть потока зависит от его ответа (допустим, что модальный возвратный логический излучатель относится к: «Вы хотите удалить элемент»). 2. Вторым наблюдаемым является действие обновления (удаления). 3. Третьим выполняется выборка новых данных после удаления.

Я использую rxjs- и пытаюсь выяснить, как это сделать без подписки вподписатьсяСмотрите мой код:

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
    const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
    this.subscriptions.push(modalRef.componentInstance.passResult.subscribe( 
    (result =>//This is the response from the modal dialog
      {
        if (result)
        {
          let updateApi : UpdateApi = new UpdateApi(data);
          this.srv.updateData(updateApi).pipe( //This is the update operation
            tap(() =>
            { 
              this.srv.getData(); //This is the fetch data operation
            }
            )

          ).subscribe();
        }
      }
    )
    ));
} 

Ответы [ 3 ]

2 голосов
/ 27 октября 2019

Вы можете использовать pipe, filter и switchMap для этого:

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
  const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
  this.subscriptions.push(
    modalRef.componentInstance.passResult
     .pipe(
       filter((result) => !!result),
       switchMap((result) => {
          let updateApi : UpdateApi = new UpdateApi(data);
          return this.srv.updateData(updateApi);
       }),
       switchMap((updateResult) => this.srv.getData())
     ).subscribe((getDataResult) => console.log(getDataResult))
  );
}

Сначала вы используете фильтр, чтобы передавать данные только тогда, когда результатом является что-то, затем вы переключаетесь на новую наблюдаемую, наблюдаемые данные обновления,и в то же время вы передаете этот канал, чтобы переключиться на получение наблюдаемых данных. Таким образом, вы связываете наблюдаемые, я полагаю, вам нужно подождать, пока результат обновления данных не получит данные снова.

РЕДАКТИРОВАТЬ: дополнительная часть информации, вы использовали tap для вызова this.srv.getData(), но еслиэто возвращает наблюдаемое с запросом http, этот запрос никогда не будет вызван, так как вам нужно подписаться на него, чтобы запрос был выполнен. Как правило, я использую отводную трубу для побочных эффектов, которые будут нуждаться только в результате наблюдаемого, но не изменят ничего, что связано с наблюдаемым, если это имеет какой-то смысл.

0 голосов
/ 27 октября 2019

Вместо того, чтобы иметь массив подписок, используйте тему с takeUntil

finalised = new Subject<void>();

, а затем используйте до тех пор, пока последний оператор в вашей наблюдаемой цепочке

modalRef.componentInstance.passResult.pipe(
  filter(result => result)
  switchMap(_ => this.srv.updateData(new UpdateApi(data)),
  switchMap(_ => this.srv.getData()),
  takeUntil(this.finialised)
).subscribe(updatedDataAfterDelete => {
  // Do stuff with updated data
});

и в вашем ngOnDestroy

this.finialised.next();
this.finialised.complete();

Таким образом, вы можете завершить все подписки одним субъектом, а не помещать их в массив подписок.

0 голосов
/ 27 октября 2019

Вы можете использовать mergeMap и iif оператор;

const subscription = modalRef.componentInstance.passResult
  .pipe(mergeMap(result => iif(() => result, of(result))))
  .pipe(mergeMap((result) => {
    let updateApi : UpdateApi = new UpdateApi(data);
    return this.srv.updateData(updateApi);
  }))
  .pipe(tap(() => this.srv.getData()))
  .subscribe();
this.subscriptions.push(subscription);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...