gpt4 book ai didi

rx-java - Observable single 是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 16:09:28 25 4
gpt4 key购买 nike

当我在 observable 上调用 .single() 时,它的类型是“Observable<`?>”,如果我将它传递给其他方法,我不相信它有任何方式知道它已被选中。我不认为我完全理解这是如何工作的。任何的想法?

最佳答案

如果类型没有通过,您可能需要弄清楚为什么没有通过 Observable 进行签名。调用它,或手动添加它。所以,对于 Observable Foo 类型:

myFooObservable.<Foo>single()

single 所做的与 limit(1) 非常相似, 除了如果上游 Observable 也会抛出错误完成时不会正好输出 1 个项目(包括 0 个项目)。

通常在设计 Observable 时链,消费者 Observable应该设计为好像它们可以处理零个或多个值。确实,另一个方法不知道从 Observable 中会发出多少东西。 .如果您希望订阅者只需要输出单个元素,则应添加 .single()Observable它是在订阅之前提交的。

例如,假设您收到了 getFoos方法:
Observable<Foo> getFoos();

出于某种原因(可能是库、代码生成器或外星人),您无法访问它的实现,因此您不知道它会发出多少东西(如果有)。如果你想强制执行一件事,你可以这样做:
getFoos().single().subscribe(
(foo) -> /* Do something with foo */,
(error) -> /* Oh noes there was an error. Maybe it completed with no output? */);

这会将它限制为一件事并且只有一件事,如果它完成而没有输出 Foo 则抛出错误。 ,或者如果它尝试输出第二个 Foo .

如果 getFoos方法有 singleObservable交给你了,应该是 getFoos作者的责任要么:
  • 设计和测试它足够好,它总是只发出一个项目。对于消费者来说,API 方面可能是最好的方法,但如果涉及外部因素,这并不总是可行的,例如在 #2...
  • 清楚地记录它可能并不总是发出单个项目,如果没有,则会向您抛出错误,因此您可以处理该错误。不是我最喜欢的方法,但在某些事情上(例如,网络响应),如果不完全发出一个项目,则声明您可能会发出错误是有意义的。 Retrofit例如,库可能会抛出 RetrofitError如果网络流的任何部分存在问题,则异常(exception)(我实际上并不肯定这有明确记录,但鉴于我在使用该应用程序时很早就发现了它,我认为它很容易找到)。他们非常擅长确保特定于网络请求/响应和解析流的内容包含在 RetrofitError 中。因此,如果发生了一些不属于该流程的严重运行时错误,它将失败并崩溃(在这种情况下通常应该如此,因为那些可能是编程错误或严重的、不可恢复的系统错误。)
  • 处理 single 下游的错误本身运算符,可以通过记录然后在没有值的情况下不发出任何内容来实现。就我的 API 口味而言,这处于中间位置。尽管它自己处理错误,但消费者在某些情况下想要处理错误并从错误中恢复,这消除了这种能力。例如,我的一个 Android 应用程序使用 retryretryWhen确定是否应该重试请求,我使用各种错误转换器来应用它们来设置不同的错误处理行为。有些请求我喜欢只记录错误并继续。其他人我喜欢做指数退避重试...其他人我可能想做 1 或 2 次立即重试,然后放弃。还有一些我可能想直接向用户显示“重试”UX 按钮。

  • 如果他们没有满足这 3 项中的至少 1 项,我会认为 API 设计得很差,因为这种行为通常会给消费者带来惊喜。

    其中一些内容有点抽象,因为我不知道您的实际用例,所以如果您有后续问题,我很乐意澄清它的各个方面。

    关于rx-java - Observable single 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482679/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com