【问题标题】:GWT RequestFactory and multiple requestsGWT RequestFactory 和多个请求
【发布时间】:2023-06-27 07:49:01
【问题描述】:

有没有办法使用 RequestFactory 在一个请求中创建两个实体?我试过了:

    EmployeeRequest request = requestFactory.employeeRequest();
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class);
    newEmployee.setName("Joe!");

    Request<Void> createReq = request.persist().using(newEmployee);
    createReq.fire();

    EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class);
    newEmployee2.setName("Sam!");

    Request<Void> createReq2 = request.persist().using(newEmployee2);
    createReq2.fire();

但我收到一个请求已在进行中的错误。当我提出两个单独的 EmployeeRequests 时:

    EmployeeRequest request = requestFactory.employeeRequest();
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class);
    newEmployee.setName("Joe!");

    Request<Void> createReq = request.persist().using(newEmployee);
    createReq.fire();

    EmployeeRequest request2 = requestFactory.employeeRequest();
    EmployeeProxy newEmployee2 = request2.create(EmployeeProxy.class);
    newEmployee2.setName("Sam!");

    Request<Void> createReq2 = request2.persist().using(newEmployee2);
    createReq2.fire();

然后从浏览器发出两个单独的请求。我希望 RequestFactory 中的某些东西可以合并多个请求 - 我必须一次创建数百个实体,而且我不想发出数百个请求!

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    是的,这是可能的。在您的第一个示例中,只需删除该行

    createReq.fire();
    

    当您最后调用 createReq2.fire() 时,GWT 在一个请求中同时发送 newEmployee 和 newEmployee2(因为它们都在您的 EmployeeRequest "request" 的上下文中保持不变)。我个人觉得语义有点奇怪,但这只是我的看法。

    莱利的附录: 下面的语法是等价的,而且更直观:

        EmployeeRequest request = requestFactory.employeeRequest();
        EmployeeProxy newEmployee = request.create(EmployeeProxy.class);
        newEmployee.setName("Joe!");
    
        request.persist().using(newEmployee);
    
        EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class);
        newEmployee2.setName("Sam!");
    
        request.persist().using(newEmployee2);
        request.fire();
    

    【讨论】:

    • 哦,真奇怪。真奇怪。这是否意味着我必须创建一些机制来安排 fire() 调用后,我已经进行了所有我想进行的 persist() 调用?我想使用延迟命令会很简单,但是......有点尴尬!
    • @Riley:我会将构建请求的所有代码包装在一个方法或它自己的对象中。我会使用一些变量(或字段)来记住最新的请求。然后在执行这部分代码之后,我会在最新的请求上调用 fire。 (我不会使用延迟命令——它太不稳定了,因为很难确定它什么时候会执行。)
    • 更新:我犯了一个愚蠢的错误,现在你的代码运行良好。我会考虑聚合请求的方法。谢谢克里斯!
    • 这是否意味着这两个员工将在单个原子事务中创建,还是仅意味着 GWT 通过同时发送两个更改来节省带宽,但每个更改都保留在不同的事务中并且可能会失败或个人成功?
    • 这取决于您的服务层以及您的服务器端持久化方法的工作方式。如果你的 persist 方法被包装在它自己的事务中,那么每个员工都会被保存在它自己的原因事务中。