【问题标题】:Observable chaining, flatMap and type casting可观察链、flatMap 和类型转换
【发布时间】:2018-09-28 22:38:35
【问题描述】:

我是 observables 的新手,我想学习。

我有一个 API.get() 方法,它返回一个 T 类型的承诺,因为 T 是:

export interface T {
    data?: object;
    errors?: [object];
    extensions?: {
        [key: string]: any;
    };

我想做的是在这样的函数中调用这个 API:

public get(): Observable<R>{

   // Convert API.get():Promise<T> to an observable
   // get T.data and cast it to type R
   // return observable<R>
   // catch potential error in T.errors 

}

我该怎么做?

【问题讨论】:

  • R 是已定义类型,还是要使 get 函数泛型?

标签: typescript promise observable


【解决方案1】:

假设您使用 rxjs6,您可以使用 from 函数将 Promise 转换为 Observable。然后你通过管道传递给map 操作符来进行转换。我不确定 R 是否是已定义的接口,或者您是否希望 get 是通用的。如果后者为真,您也需要将&lt;R&gt; 放在get 之后,然后使用as 关键字。不过,对于大多数类型来说,这可能会失败。

import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators'

/*...*/
public get<R>(): Observable<R>{
    const obs = from(API.get());
    return obs.pipe(map(response => response as R));
}

【讨论】:

  • 你也可以和catchErrors一起玩来完成问题中关于错误的部分
  • 谢谢。 R 是一个类似的接口
  • 好的,如果 R 是一个已知的接口,我们需要知道正确转换它的样子。但是,如果 R 只有一个 data 字段,则转换将如下所示:&lt;R&gt;{data: response.data}
  • @PAc0 就我而言,我有两个错误来源:1. 当 API.Get() 失败时 2. T.errors 不为空。 get() 在我的服务层中,我在组件级别订阅它。订阅时如何检查所有这些错误?
  • 我建议您在订阅之前使用catchError 运算符。将其放在管道内的map 之后。您应该能够通过谷歌搜索找到好的文档。如果您仍然无法弄清楚,请在 stackoverflow 上创建一个新问题,在其中提及您尝试过的内容。
猜你喜欢
  • 2019-07-13
  • 2018-01-04
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多