Как использовать диалоги материалов в последовательности Observable pipe

Для приложения, которое я переписываю с AngularJS, у меня есть последовательность действий:

1) I got to the server to get a message  
2) I display the returned message in a generic dialog, with a Yes and No button.  

3-Yes) I go to the server to do something, proceed to 4  
3-No) I terminate the sequence  

4) Notfiy the user that the operation is complete.

Однако у меня проблемы с переводом этого в систему Angular/React Observable. Я хочу сделать что-то вроде этого:

// Actual arguments are immaterial in this case...
this.webDataService.get('/api/GetEndUserMessage', args)
  .pipe(
    map((message: string) => {
      const config = new MatDialogConfig();
      config.data = {
        'title': 'Important',
        'message': message
      };
      const dialog = this.matDialog.open(GenericDialogComponent, config);
      // If Yes/Ok is clicked, return 'Ok'
      // If No/Cancel is clicked, return 'Cancel'

      return dialog.afterClosed();
    }),
    // PROBLEM AREA! ----------------------------------------------
    filter((dialogResult: string) => {
      if (dialogResult === 'Ok')
        return this.webDataService.post('/api/DoSomethingAwesome');
    }),
    filter((dialogResult: string) => {
      if (dialogResult !== 'Ok')
        return 'Cancelled'
    })
    // PROBLEM AREA! ----------------------------------------------
  )
  .subscribe((result: any) => {
    if (result === 'Cancelled')
      return;

    // Let the user know that the sequence is over.  How doesn't matter.
  });

Проблема в том, что, видимо, это не компилируется.

Мое понимание системы операторов React в лучшем случае шатко, и я не уверен, как вызвать Observable, созданный в результате вызова MatDialogRef.afterClosed().

Вопрос:
Как я могу использовать результаты вызова MatDialogRef.afterClosed() в последовательности Observable .pipe?

Тестирование функциональных 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
0
899
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте switchMap, когда вам нужно изменить наблюдаемые потоки. Оператор map() просто заставит наблюдаемое выдать возвращаемое значение.

this.webDataService.get('/api/GetEndUserMessage', args)
  .pipe(
    switchMap((message: string) => {
        //...
        const dialog = this.matDialog.open(GenericDialogComponent, config);
        return dialog.afterClosed();
    }),
    switchMap((dialogResult: string) => {
        return (dialogResult === 'Ok')
            ? this.webDataService.post('/api/DoSomethingAwesome')
            : of('Cancelled')
    })
).subscribe((result: any) => { ... });

https://www.learnrxjs.io/operators/transformation/switchmap.html

Не оставит ли это потенциально несколько диалогов открытыми, если будут выданы новые значения? Я думал, что смысл использования switchMap в том, что первый поток должен быть отменен, если выдается новое значение.

JW. 16.04.2020 20:50

@JW. Все методы HttpClient выдают значение только один раз. То, что вы говорите, верно, но в этом примере восходящая наблюдаемая выдает только одно значение.

Reactgular 16.04.2020 21:06

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