2010-03-16 273 views
1

我正在爲我的項目使用gwt和postgres。在前端,當我點擊「保存項目」按鈕(這也需要創建項目的名稱)時,我有幾個小部件的數據我試圖保存到後端的表中。異步回調 - gwt

在異步回調部分,我設置了多個表。但它沒有正確發送數據。我收到以下錯誤:

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在上面的代碼不是它第一次完成,然後移動到下一個?

請任何輸入將不勝感激。

謝謝。

回答

2

使用該外鍵約束,您必須確保erasync.setProjects(...)已經完成,然後再插入其餘的東西。

我建議在onsuccess回調中(或從中)執行erasync.setEntityAttribute(...)魔法,而不是直接跳到它。

+0

我曾嘗試將onsuccess部分併入,但它不能識別回調。這是否意味着我必須在onsuccess中執行異步回調? 謝謝。 – suprasad 2010-03-16 16:41:09

+0

謝謝。我工作... – suprasad 2010-03-17 20:54:58

+0

哦,太好了。感謝您報告成功! (你做了成功嗎?:)) – npup 2010-03-17 21:01:14

0

由於異步的性質,不要假設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); 
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 */ 
     }      
    }); 

第二個選項是最有可能會因爲幾個嵌套的異步回調迅速增長得相當廣泛而且令人困惑,所以你只提出一個請求。