RXJS6 - 从Promise函数返回一个Observable,它返回一个Observable?

时间:2018-06-10 19:40:11

标签: javascript rxjs es6-promise

我有一个方法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();返回的值(和错误)( shows()的返回值不必是一个可观察的,它也可以是一个承诺)。

所以我这样做了:

  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构造函数方法。

如果不使用可观察的构造函数(包括错误处理)解决方案,是否可以解决此问题?

Full demo code

1 个答案:

答案 0 :(得分:2)

为什么不将Promise包装到Observable 中(以便您可以使用Observable可以提供的所有运算符),然后使用switchMap()

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

工作StackBlitz