Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 异步回调-gwt_Sql_Postgresql_Gwt_Asynchronous_Asynccallback - Fatal编程技术网

Sql 异步回调-gwt

Sql 异步回调-gwt,sql,postgresql,gwt,asynchronous,asynccallback,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"

我正在为我的项目使用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);
}                           
                                    }
    }
oksave.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
if(erasync==null)
erasync=GWT.create(EntityRelationService.class);
AsyncCallback callback=新的AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
}
@凌驾
成功时公开作废(作废结果){}
};      
setProjects(projectname,回调);
对于(int i=0;i
问题:

  • 在异步回调中设置多个表(其中所有其他表都依赖于某个特定表)是错误的吗
  • 当我在上面的代码中说setProjects时,它不是先完成,然后转移到下一个吗
  • 如果您有任何意见,我们将不胜感激


    谢谢。

    有了外键约束,您必须确保erasync.setProjects(…)已完成,然后才能插入其余内容


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

    由于异步的性质,不要假设在
    setEntityAttribute
    setEntityType
    之前将在服务器上调用
    setProjects(…)
    方法

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

    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);
    

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

    当您调用多个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.callFirst(someData,new AsyncCallback callback=new AsyncCallback(){
    @凌驾
    public void onFailure(可丢弃捕获){/*句柄错误*/}
    @凌驾
    成功时公开作废(作废结果){
    service.callSecond(someOtherData,new AsyncCallback callback=new AsyncCallback(){
    /*此处为第二次回调的onSuccess和onFailure*/
    });
    }                       
    });
    
    或者创建一个同时执行这两项操作的服务调用(推荐):

    service.callFirstAndSecond(someData,someOtherData,new AsyncCallback callback=new AsyncCallback(){
    @凌驾
    public void onFailure(可丢弃捕获){/*句柄错误*/}
    @凌驾
    成功时公开作废(作废结果){
    /*成功*/
    }                       
    });
    

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

    我尝试将onsuccess部分合并,但它无法识别回调。这是否意味着我也必须在onsuccess中执行异步回调?谢谢。哦,太好了。谢谢你的成功报道!(你成功了吗?:)
        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 */
            }                       
        });