当前位置: 首页 > 知识库问答 >
问题:

在Vaadin UI上执行异步操作

汪永春
2023-03-14

我有一个带有Vaadin集成(v14)的Spring Boot项目。我希望我的应用程序做一些后台操作,并在基于Vaadin的前端上表示结果。为此,我有一个视图,它是用Vaadin Designer(.js)生成的聚合物模板,并连接到Java companion类。在这个视图中,我只是简单地添加了一个用以下监听器初始化的按钮:

        _btnMyTriggerButton.addClickListener(event -> {

        CompletableFuture<Void> c = CompletableFuture.supplyAsync(() -> {
            for (int i = 0; i < 5; i++)
            {
                try
                {
                    System.out.println("Waiting");
                    Thread.sleep(1000);
                    UI.getCurrent().access(() -> {
                        Notification.show("Waiting");
                    });
                }
                catch (InterruptedException e)
                {
                }
            }
            return "Waiting over. Greet!";
        }).thenAccept(s -> {
            System.out.println(s);
            UI.getCurrent().access(() -> {
                Notification.show(s);
            });
        });

我正试图访问文档中所说的UI。然而,当它被执行时,它只到达第一个“等待”,然后停止。如果我删除UI交互(notification.show()),输出会按需要打印到后端,但在试图对UI进行任何交互时不会。

我的java companion类的结构如下:

@Tag("my-view")
@JsModule("./my-view.js")
@Route("")
@Push(PushMode.AUTOMATIC)
public class MyView extends PolymerTemplate<MyView.MyModel>
{
    @Id("trigger-button")
    private Button _btnMyTriggerButton;

    MyView() {
     // listener initialization code described above
    }
    public interface MyModel extends TemplateModel
    {
    }

共有1个答案

宗翔宇
2023-03-14

这种情况下的问题是,第一个回调以nullPointerException终止,因为ui.getCurrent()从后台线程运行时返回nullCompletableFuture将忽略异常,除非您显式地处理它(例如,使用handle而不是thenaccept)或对结果进行块处理。

可以通过在单击监听器的开头添加ui ui=ui.getcurrent();,然后在SupplyAsyncThenAccept回调中引用ui,而不是在那里使用ui.getcurrent()来解决这个问题。

 类似资料:
  • 异步注解@Async,默认情况下是不生效的,需要的话可以启用. 该加载器有一个可选参数,线程池大小,默认是32,详情可以查阅org.nutz.aop.interceptor.async.AsyncAopIocLoader @IocBy( args={"*json","ioc/", "*anno","net.wendal.nutzbook", "*a

  • Node 库以多种方式处理异步功能。最常见的模式是 error-first callbacks,但是你还可能会遇到 streams、promises、event emitters、child processes, 或 observables。gulp 任务(task)规范化了所有这些类型的异步功能。 任务(task)完成通知 当从任务(task)中返回 stream、promise、event e

  • 我正在学习如何在C++中异步使用gRPC。查看https://github.com/grpc/grpc/blob/v1.33.1/examples/cpp/helloworld/greeter_async_client.cc中的客户机示例 除非我误解了,否则我没有看到任何异步演示。只有一个RPC调用,它在主线程上阻塞,直到服务器处理它并将结果发回。 我需要做的是创建一个客户机,该客户机可以执行一个

  • 本文向大家介绍async/await让异步操作同步执行的方法详解,包括了async/await让异步操作同步执行的方法详解的使用技巧和注意事项,需要的朋友参考一下 一.前言 我们经常会遇到这样的麻烦事,多个函数按顺序执行,返回结果却不是我们预期的顺序,原因一般是由于异步操作引起的,所以呢,我们需要一种解决方案来处理这种问题,从而使得异步操作按照同步的方式来执行,这样我们就可以控制异步操作输出结果的

  • 问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是

  • 概述 定时器 Promise 对象