如何在Mono.subscribe

时间:2019-10-07 08:57:11

标签: java vaadin webclient vaadin-flow

  public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              UI.getCurrent().navigate("route");
            });
  }

sessionService有效,但是UI.getCurrent返回null。有没有办法在订阅中导航?

1 个答案:

答案 0 :(得分:3)

它可能在后台线程中执行。 UI.getCurrent()仅在UI线程中起作用。

您需要在仍然位于UI线程中的位置,或通过在连接的组件上调用getUI()来存储对UI的引用。如果您的方法是在UI线程中执行的,则可以在其中存储引用。然后,您调用UI#access来执行所有UI任务:

public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    UI ui = UI.getCurrent();
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              ui.access(() -> ui.navigate("route"));
            });
}

从后台线程进行调用时使用UI#access可确保会话已锁定,因此UI状态不会发生任何冲突。它还可以确保UI.getCurrent()VaadinSession.getCurrent()返回正确的值。