异步回调 - gwt

时间:2010-03-16 00:05:28

标签: sql postgresql gwt asynchronous asynccallback

我正在为我的项目使用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".

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

以下是回调部分的外观:

        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不是先完成然后转到下一个代码?
  3. 请不要错过任何意见。

    谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

由于Async的性质,不要假设在setProjects(...)setEntityAttribute之前在服务器上调用setEntityType方法。

就个人而言,我更喜欢拥有一个包含所有必要信息的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 :(得分:0)

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

任何时候你拨打多个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 */
        }                       
    });

第二个选项很可能不那么混乱,因为几个嵌套的异步回调很快变得非常宽泛和令人困惑,而且你只做了一个请求。