首页 > 解决方案 > RXJS6 - 从返回 Observable 的 Promise 函数返回 Observable?

问题描述

我有一个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() 的返回值不必是 Observable,它也可以是一个 Promise )返回的值(和错误)。

所以我这样做了:

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

不使用可观察构造函数(包括错误处理)解决方案可以解决这个问题吗?

完整的演示代码

标签: javascriptrxjses6-promise

解决方案


为什么不直接将 包装Promise成 an Observable (这样您就可以使用 anObservable可以提供的所有运算符),然后使用 a switchMap()

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

工作堆栈闪电战


推荐阅读