【问题标题】:RXJS6 - return an Observable from a Promise function which returns an Observable?RXJS6 - 从返回 Observable 的 Promise 函数返回 Observable?
【发布时间】:2018-06-10 19:40:10
【问题描述】:

我有一个方法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,它也可以是一个承诺)。

所以我这样做了:

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

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

Full demo code

【问题讨论】:

  • 不要使用Observable 构造函数。有内置的方法可以从和转换为 Promise,使用它们。
  • @Bergi 更改后,没有返回正确的结果...stackblitz.com/edit/…

标签: javascript rxjs es6-promise


【解决方案1】:

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

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

工作StackBlitz

【讨论】:

  • 我应该看过的 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2018-03-12
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多