Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java 可观测单粒子是如何工作的?_Rx Java_Observable - Fatal编程技术网

Rx java 可观测单粒子是如何工作的?

Rx java 可观测单粒子是如何工作的?,rx-java,observable,Rx Java,Observable,当我对一个observable调用.single()时,它的类型是“observable”,如果我将它传递给另一个方法,我不相信它有任何方法知道它已被singled。我不认为我完全理解这是怎么回事。有什么想法吗?如果类型没有通过,您可能需要找出为什么签名没有从调用它的可观察的中进行,或者手动添加它。因此,对于Foo类型的可观察的: myFooObservable.<Foo>single() 出于某种原因(可能是一个库,或codegen,或外星人),您无法访问此实现,因此您不知道它将

当我对一个observable调用.single()时,它的类型是“observable”,如果我将它传递给另一个方法,我不相信它有任何方法知道它已被singled。我不认为我完全理解这是怎么回事。有什么想法吗?

如果类型没有通过,您可能需要找出为什么签名没有从调用它的
可观察的
中进行,或者手动添加它。因此,对于Foo类型的
可观察的

myFooObservable.<Foo>single()
出于某种原因(可能是一个库,或codegen,或外星人),您无法访问此实现,因此您不知道它将发出多少东西(如果有的话)。如果您只想强制执行一件事,您可以执行以下操作:

getFoos().single().subscribe(
    (foo) -> /* Do something with foo */,
    (error) -> /* Oh noes there was an error. Maybe it completed with no output? */);
这会将它限制为一件且仅限于一件事,如果它完成而没有输出
Foo
,或者如果它试图输出第二个
Foo
,则会抛出错误

如果
getFoos
方法在它交给您的
Observable
上有
single
,则
getFoos
的作者应负责:

  • 充分设计和测试它,使其始终只发射一个项目。对于消费者来说,API可能是最好的方法,但如果涉及到外部因素,例如#2
  • 清楚地记录它可能并不总是发出单个项,如果不发出,它将抛出一个错误,因此您可以处理该错误。这不是我最喜欢的方法,但在某些情况下(例如,网络响应),声明如果没有发出一个项目,您可能会发出错误是有意义的。例如,如果网络流的任何部分出现问题,该库可能会抛出
    reformationerror
    异常(我实际上不确定这是否有明确的文档记录,但考虑到我在使用该应用程序的早期就发现了,我想很容易找到)。他们非常擅长于确保特定于网络请求/响应流和解析流的内容被包装在
    reformationerror
    s中,因此,如果发生不属于该流的严重运行时错误,它将崩溃(在这种情况下通常应该如此,因为这些可能是编程错误或严重的、不可恢复的系统错误。)
  • 处理<代码>单< <代码>运算符的下游本身,可能通过日志记录,如果没有值就发出任何东西。这是在我的API品味中的某个中间点。尽管它处理错误本身,但有消费者希望处理和恢复错误的合法情况,并且is删除了该功能。例如,我的一个Android应用程序使用
    retry
    retryWhen
    来确定是否应该重试请求,我使用各种错误转换器来应用这些设置不同的错误处理行为。一些请求我喜欢只记录错误并继续。其他的我喜欢做指数退避重试…其他我可能希望立即重试1或2次,然后放弃。还有一些我可能希望直接向用户显示“重试”UX按钮
  • 如果他们不满足这3种中的至少1种,我会认为API设计得很差,因为行为通常会给消费者带来惊喜。
    其中有些内容有点抽象,因为我不知道您的实际用例,所以如果您有后续问题,我很乐意澄清其中的各个方面。

    您的意思是
    Single s=observable.toSingle()
    ?我想这还没有发布。应该在1.0.13或-Snapshot.toSingle()上提供方法存在,但它不返回一个,它返回一个可观察的。这个答案是基于
    .Single
    调用
    可观察的
    .singl。根据您的一些其他开放性问题,您可能至少部分询问了实验性
    Single
    类。主要区别在于
    .single
    使
    可观察
    只发出一个或一个错误,其中
    单个
    还提供了强制执行该错误的类型。我认为API设计问题仍然适用于这两种方式。
    getFoos().single().subscribe(
        (foo) -> /* Do something with foo */,
        (error) -> /* Oh noes there was an error. Maybe it completed with no output? */);