有两种类型"在我的申请中RxJS Observable
s:
Observable
只返回数据且永不返回Error
,因此我可以安全.subscribe()
到Observable
而不传递error
回调< / LI>
Observable
可能会返回数据或可能会返回Error
,因此在订阅Observable时,我应同时提供next
和error
回调 Observable.throw()
会返回ErrorObservable
。因此,返回类型2的Observable
的函数返回类型Observable<Foo> | ErrorObservable
。如果我想要.subscribe()
到Observable
,那么TypeScript奇怪地需要0个参数,所以根本没有next
和error
回调,这对我来说似乎不对。因此,我认为我必须将类型2 Observable
表示为Observable<Foo>
。但是,作为想要订阅Observable
的人,我永远不知道Observable
是否可以返回Error
。
那么如何正确区分这两种情况呢?我在这里错过了什么吗?
答案 0 :(得分:1)
通常,每个Observable都可以发送next
和error
个通知。您无法拥有无法发送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上添加一个错误处理程序。