如何区分可能返回错误的RxJs Observable和TypeScript中可能没有的?

时间:2017-11-22 11:49:27

标签: typescript rxjs observable

有两种类型"在我的申请中RxJS Observable s:

  1. Observable只返回数据且永不返回Error,因此我可以安全.subscribe()Observable而不传递error回调< / LI>
  2. Observable可能会返回数据或可能会返回Error,因此在订阅Observable时,我应同时提供nexterror回调
  3. Observable.throw()会返回ErrorObservable。因此,返回类型2的Observable的函数返回类型Observable<Foo> | ErrorObservable。如果我想要.subscribe()Observable,那么TypeScript奇怪地需要0个参数,所以根本没有nexterror回调,这对我来说似乎不对。因此,我认为我必须将类型2 Observable表示为Observable<Foo>。但是,作为想要订阅Observable的人,我永远不知道Observable是否可以返回Error

    那么如何正确区分这两种情况呢?我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:1)

通常,每个Observable都可以发送nexterror个通知。您无法拥有无法发送error通知的观察信息。

这些打包不会告诉你任何Observable是否会发出错误,因为它总是可以。所以打字只能帮助你获得next值。

请注意,Observable本身可能不会发出错误,但错误可能来自一系列运算符。例如,如果您Observable.from([1, 2, 3, 4])通常没有发出任何错误,请使用以下内容对其进行链接:

const s = new Subject<number>();

const source = Observable.from([1, 2, 3, 4])
  .merge(s)
  .map((v: number) => {
    if (v === 'a') {
      throw new Error();
    }
    return v;
  })

s.next('a' as any);

您会将source视为可能发出错误的Observable吗?

这些打字不允许你使用除数字之外的任何东西。但你可以,例如。错误地传递一个字符串。

答案 1 :(得分:0)

您似乎无法使用代码执行此操作。您可能确定某个某个observable可能永远不会抛出(例如:Observable.from(1)只发出一个并完成;没有错误的地方)并省略onError回调。对于其他人,建议提供onError回调以优雅地退出。

正如您所提到的,您不能使用类型Observable<Foo> | ErrorObservable进行订阅,因为ErrorObservable的接口不包含subscribe方法。如您所见,它就是它 - 错误。您使用了类型交集,这意味着结果类型仅包含上的属性和方法 Observable<Foo>ErrorObservable不包含名为subscribe的方法,所以结果类型也不会包含它。您可能希望使用类型union,如Observable<Foo> & ErrorObservable,因此结果类型包含至少一个包含类型中存在的方法,因此您可以subscribe到它。阅读有关类型交叉点和联合here

的更多信息

答案 2 :(得分:0)

我真的不相信这种区别是有道理的。根据设计,可观察量总是可能发出错误。

请注意,如果在可观察代码中的任何位置抛出异常也会导致发出错误,那么即使您认为observable不能发出错误,也总是有可能用完内存或堆栈空间或遇到代码中的错误,这会发出错误。

因此IMO应该像处理JavaScript中的异常一样处理可观察的错误 - 无论它们发生在何处,都需要对它们进行处理。 (顺便说一下,Java区分RuntimeExceptions,它们本质上是计划外的异常和需要声明和捕获的异常,这是你要寻找的区别,但是JavaScript并没有做那样的事情。)

简而言之:我只想在每个observable上添加一个错误处理程序。