我如何区分可能返回错误的RxJs可观测对象和可能不在TypeScript中的RxJs可观测对象?
在我的应用程序中有两种“类型”的我如何区分可能返回错误的RxJs可观测对象和可能不在TypeScript中的RxJs可观测对象?,typescript,rxjs,observable,Typescript,Rxjs,Observable,在我的应用程序中有两种“类型”的可观察的s: Observables只返回数据,从不返回错误,因此我可以安全地.subscribe()订阅Observable,而无需传递错误回调 可观察的s可能返回数据或可能返回错误,因此在订阅可观察的时,我应该提供下一个和错误回调 Observable.throw()返回一个ErrorObservable。因此,返回类型2的可观察的函数返回类型可观察| ErrorObservable。如果我想.subscribe()到那个可观察的,TypeScript奇怪地期
可观察的s:
Observable
s只返回数据,从不返回错误
,因此我可以安全地.subscribe()
订阅Observable
,而无需传递错误
回调
可观察的
s可能返回数据或可能返回错误
,因此在订阅可观察的时,我应该提供下一个
和错误
回调
Observable.throw()
返回一个ErrorObservable
。因此,返回类型2的可观察
的函数返回类型可观察| ErrorObservable
。如果我想.subscribe()
到那个可观察的,TypeScript奇怪地期望0个参数,所以没有next
和error
回调,这对我来说似乎是错误的。因此,我认为我必须将类型2Observable
s表示为Observable
。但是,作为一个想要订阅可观察的
的人,我永远不知道可观察的
是否会返回一个错误
那么,我如何才能正确区分这两种情况呢?我在这里遗漏了什么吗?似乎您无法使用代码来完成这项工作。您可以肯定地知道,某个可观察对象可能永远不会抛出(例如:observatable.from(1)
只发出一个并完成;没有错误的位置)并忽略onError
回调。对于其他人,建议提供onError
回调以正常退出
正如您所提到的,您不能使用typeObservable | ErrorObservable
订阅,因为ErrorObservable
的界面不包含subscribe
方法。正如你所看到的,这是一个错误。您使用了类型交叉,这意味着生成的类型只包含上存在的属性和方法,而可观察的和错误可观察的不包含名为订阅的方法,因此生成的类型也不包含它。您可能希望使用类型联合,例如,Observable&ErrorObservable
,这样生成的类型包含至少一个包含的类型中存在的方法,因此您可以订阅它。阅读更多有关类型交点和并集的信息我真的不相信这种区别是有意义的。通过设计,可观察对象总是可能发出错误
请注意,如果在可观察代码中的任何位置抛出异常,也会导致发出错误,因此,即使您认为可观察代码无法发出错误,内存或堆栈空间不足或代码中遇到错误的可能性也很小,这将发出错误
因此,在我看来,您应该像对待JavaScript中的异常一样对待可观察到的错误——无论它们发生在哪里,都需要处理它们。(顺便提一下,Java区分了RuntimeException(本质上是计划外的异常)和需要声明和捕获的异常,这是您要寻找的区别,但JavaScript没有这样做。)
简而言之:我只需要在每个可观察对象上添加一个错误处理程序。一般来说,每个可观察对象都可以发送next
和error
通知。您不能有一个无法发送错误
通知的可观察对象
打字不能告诉你一个可观察的物体是否会发出错误,因为它总是会发出错误。因此,键入仅对next
值有帮助
请注意,可观察对象本身可能不会发出错误,但错误可能来自一系列运算符。例如,如果您有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);
const s=新主题();
常量源=可观察的。从([1,2,3,4])
.合并
.map((v:编号)=>{
如果(v=='a'){
抛出新错误();
}
返回v;
})
s、 下一步(“a”如有);
你会考虑<代码>源>代码>作为一个可观察到的可能会发出错误的信息吗?
打字不允许你使用数字以外的任何东西。但是您可以(例如)错误地传递一个字符串。如果我使用union类型,我不能直接在可观察的
上订阅()
,因为它也可能是一个可观察的错误
,对吗?理想情况下,我希望Observable
指示它是否返回错误,例如Observable
之类的内容。这个案例的“最佳实践”是什么?这并不完全正确。事实上,你并不真的需要这样一个类型的联合。当一个普通的可观察对象抛出错误时,它不会“转换”为一个ErrorObservable
,而是发出一个error
通知供观察者使用。我们确实使用了Observable.throw
在可观察链中以编程方式抛出错误,因此发出error
通知Observable
就像Observable.from(1)
永远不会返回错误。对我来说,在那里添加错误回调是没有意义的。。。另外,在我的Angular应用程序中,有一个全局错误处理程序,它捕获所有未处理的错误。因此,如果我忘记传递错误
回调,全局处理程序将接收它。因此,我并不担心遗漏一个错误
,但它实际上只是关于代码中的区别。