RXJS6 - вернуть Observable из функции Promise, которая возвращает Observable? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть метод getData, который возвращает Observable<SupportingDocument>.
( код и возвращаемое значение нельзя изменить, поскольку это внешний API ).

  getData(): Observable<SupportingDocument> {
    return of(new SupportingDocument());
  }

Когда пользователь нажимает кнопку, мы фактически показываем ему модальную страницу.Когда этот модальный режим закрыт (Promise api) - мы должны вызвать getData() и вернуть значение:

  public dialogShow(): Promise<Observable<SupportingDocument>> {
    return Promise.resolve(1).then(() => { //modal was closed
      return this.getData();
    })
  }

В конце я должен предоставить метод show(), который должен вернуть значение (и ошибки), который возвращается из return this.getData(); ( возвращаемое значение показывает () не обязательно должно быть наблюдаемым, это может быть также обещание ).

Итак, я сделал это:

  public show(): Observable<SupportingDocument> {
    return new Observable<SupportingDocument>((obs) => {
      this.dialogShow().then((res: Observable<SupportingDocument>) => obs.next(res), (res) => obs.error(res));
    })
  }

Полный код:

//user starts here
public show(): Observable<SupportingDocument> {
    return new Observable<SupportingDocument>((obs) => {
      this.dialogShow().then((res: Observable<SupportingDocument>) => obs.next(res), (res) => obs.error(res));
    })
  }



  public dialogShow(): Promise<Observable<SupportingDocument>> {
    return Promise.resolve(1).then(() => {
      return this.getData();
    })
  }


  getData(): Observable<SupportingDocument> {
    return of(new SupportingDocument());

  }

Вопрос

Мне кажется, я слишком усложнил такой простойзадача.Больше - мне действительно не нравится конструктивный подход new Observable.

Может ли эта проблема быть решена без использования наблюдаемого конструктора (включая обработку ошибок)?

Полный демонстрационный код

1 Ответ

0 голосов
/ 11 июня 2018

Почему бы просто не обернуть Promise в Observable (чтобы вы могли использовать все операторы, которые может предоставить Observable) , а затем использовать switchMap()?

public dialogShow(): Observable<SupportingDocument> {
    return from(Promise.resolve(1)).pipe(switchMap(() => this.getData()));
}

Рабочая StackBlitz

...