【问题标题】:How to handle empty event in Spring reactor如何处理 Spring 反应器中的空事件
【发布时间】:2018-03-04 07:55:39
【问题描述】:

嗯,这听起来与反应式编程的含义相反,但我无法理解处理空值/异常的方法。

private static class Data {
    public Mono<String> first() {
        return Mono.just("first");
    }
    public Mono<String> second() {
        return Mono.just("second");
    }

    public Mono<String> empty() {
        return Mono.empty();
    }
}

我理解从根本上说,除非发布者发布事件,否则订阅者不会采取行动。所以这样的代码可以工作。

Data data = new Data();
data.first()
    .subscribe(string -> Assertions.assertThat(string).isEqualTo("first"));

如果第一次调用返回空,我可以这样做。

Data data = new Data();
data.empty()
    .switchIfEmpty(data.second())
    .subscribe(string -> Assertions.assertThat(string).isEqualTo("second"));

但是当两个调用都返回空时,我该如何处理(通常这是需要传播给用户的异常情况)。

Data data = new Data();
data.empty()
    .switchIfEmpty(data.empty())
    .handle((string, sink) -> Objects.requireNonNull(string))
    .block();

由于没有发布事件,因此在上述示例中未调用句柄。

【问题讨论】:

  • 不是专家,所以我不会将其作为答案发布,但为什么不第二次调用 switchIfEmpty(),以 Mono.error() 作为参数,然后传递错误回调在 subscribe() 中处理错误?
  • 谢谢!我相信这似乎是最好的方法!

标签: spring project-reactor


【解决方案1】:

正如 JB Nizet 指出的那样,您可以将 switchIfEmptyMono.error 连在一起。

或者,如果您可以使用 NoSuchElementException,您可以链接到 single()。它强制执行 exactly one 元素的强契约,否则会传播该标准异常。

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2021-08-19
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多