Как лучше написать Subscribe в Subscribe Angular? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть диалоговое окно, и я подписываюсь на его метод afterclosed (), и если результат верен, я вызываю другую службу и подписываюсь на нее.

Я не хочу иметь подписку внутри подписки.

Как лучше это написать? Я полагаю, что операторы Rx js могут помочь, но как и почему это лучше?

dialog.afterClosed().subscribe((result) => {
      if (result) {
        this.projectService.deleteProject(name).subscribe(
          () => {
            this.getProjects();
          },
          (error) => {
            this.alertify.error(error);
          }
        );
      }
    });

1 Ответ

1 голос
/ 05 августа 2020

Вы можете использовать один из операторов сопоставления более высокого порядка Rx JS switchMap, concatMap, flatMap (он же mergeMap) или exhaustMap. У каждого есть свой конкретный c вариант использования. Вы можете найти хорошее описание здесь .

Я буду использовать switchMap для иллюстрации. Я также возвращаю константу Rx JS EMPTY, если result из первого запроса ложно / не определено. Он выдает уведомление complete без next или error. Таким образом, ни одна из функций this.getProjects() или this.alertify.error(error) не запускается.

import { EMPTY } from 'rxjs';
import { switchMap } from 'rxjs/operators';

dialog.afterClosed().pipe(
  switchMap(result => {
    if (result) {
      return this.projectService.deleteProject(name);
    }
    return EMPTY;                 // <-- complete without `next` or `error` notifications
  })
).subscribe(
  res => this.getProjects(),
  error => this.alertify.error(error)
);
...