【问题标题】:Asynchronous callback - gwt异步回调 - gwt
【发布时间】:2011-01-27 22:09:51
【问题描述】:

我在我的项目中使用 gwt 和 postgres。在前端,当我单击“保存项目”按钮时,我尝试将其数据保存到后端表中的一些小部件(这也是创建项目的名称)。

在异步回调部分,我设置了多个表。但它没有正确发送数据。我收到以下错误:

org.postgresql.util.PSQLException: ERROR: insert or update on table "entitytype" violates foreign key constraint "entitytype_pname_fkey"
  Detail: Key (pname)=(Project Name) is not present in table "project".

但是当我在项目表上执行选择语句时,我可以看到项目名称存在。

回调部分如下所示:

        oksave.addClickHandler(new ClickHandler(){
                            @Override
                            public void onClick(ClickEvent event) {
                                if(erasync == null)
                                    erasync = GWT.create(EntityRelationService.class);
                                AsyncCallback<Void> callback = new AsyncCallback<Void>(){
                                    @Override
                                    public void onFailure(Throwable caught) {
                                        }

                                    @Override
                                    public void onSuccess(Void result){  }                          
                        };      
    erasync.setProjects(projectname, callback);

                                for(int i = 0; i < boundaryPanel.getWidgetCount(); i++){

                                    top = new Integer(boundaryPanel.getWidget(i).getAbsoluteTop()).toString();
                                    left = new Integer(boundaryPanel.getWidget(i).getAbsoluteLeft()).toString();
                                    if(widgetTitle.startsWith("ATTR")){
                                        type = "regular";

                                            erasync.setEntityAttribute(name1, name, type, top, left, projectname, callback);
                                        }   else{
erasync.setEntityType(name, top, left, projectname, callback);
}                           
                                    }
    }

问题:

  1. 在所有其他表都依赖于特定表的异步回调中设置多个是否错误?
  2. 当我在上面的代码中说 setProjects 时,它不是先完成然后移动到下一个吗?

如有任何意见,我们将不胜感激。

谢谢。

【问题讨论】:

    标签: sql postgresql gwt asynchronous asynccallback


    【解决方案1】:

    由于异步的性质,不要假设setProjects(...) 方法会在setEntityAttributesetEntityType 之前在服务器上被调用。

    就个人而言,我更喜欢有一个包含所有必要信息的Project 类,例如:

    public class Project{  
          private String projectName;  
          private List attributes = new ArrayList();  
          .. other properties  
    
      // Getter & Setter methods  
    }
    

    然后单程发送到服务器:

    Project project = new Project();  
    project.setProjectName(..);  
    // Set other properties  
    erasync.saveProjects(project, callback);
    

    【讨论】:

      【解决方案2】:

      您正在触发几个请求,其中(从错误消息中猜测)确实应该按顺序调用。

      任何时候你调用多个 rpc 调用;尝试认为您应该能够以任何顺序重新排列它们(因为这几乎是实际发生的事情,因为它们是异步的)......如果以相反的顺序运行它们没有意义;你不能按顺序发射它们!

      解决问题的两种方法:

      嵌套:

          service.callFirst(someData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
              @Override
              public void onFailure(Throwable caught) {/*Handle errors*/}
              @Override
              public void onSuccess(Void result){
                  service.callSecond(someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){ 
                      /* onSuccess and onFailure for second callback here */ 
                  });
              }                       
          });
      

      或创建一个同时执行这两种操作的服务调用(推荐):

          service.callFirstAndSecond(someData, someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
              @Override
              public void onFailure(Throwable caught) {/*Handle errors*/}
              @Override
              public void onSuccess(Void result){
                  /* Handle success */
              }                       
          });
      

      第二个选项很可能不会那么混乱,因为几个嵌套的异步回调很快就会变得非常广泛和混乱,而且你只发出一个请求。

      【讨论】:

        【解决方案3】:

        使用该外键约束,您必须确保在插入其余内容之前 erasync.setProjects(...) 已完成。

        我建议在(或从)onsuccess 回调中执行 erasync.setEntityAttribute(...) 魔术,而不是直接跳到它。

        【讨论】:

        • 我确实尝试合并到 onsuccess 部分,但它无法识别回调。这是否意味着我也必须在 onsuccess 中进行异步回调?谢谢。
        • 哦,太好了。感谢您报告成功! (你在Success上做到了吗?:))
        猜你喜欢
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多