如何从gwt延迟对数据库的调用?

时间:2014-03-12 20:19:48

标签: java gwt

我使用gwt + java。应用程序正在使用多个数据库。问题是查询比流程数据库更改更快,这是ui中数据不正确的原因。我怎么能拖延?

reps.addChangeHandler(new ChangeHandler() {
    public void onChange(ChangeEvent event) {
    final String repPath = reps.getValue(reps.getSelectedIndex());
        RootPanel.get("loadingbarImg").setVisible(true);    
        reps.setEnabled(false);
//next line change database
        serverCall("changeRep" + repPath);
 //then I update the tables "git" and "bugs"   
        serverCall("git");
        serverCall("bugs");
        reps.setEnabled(true);
    }
}
);

方法serverCall()不返回任何值。这是gwt的客户端,因此Thread.sleep()是不可接受的。

2 个答案:

答案 0 :(得分:2)

我认为你错过了最重要的部分。

GWT是一个客户端/服务器应用程序。 JavaScript完全异步。因此,应用程序将在serverCall("changeRep" + repPath);中进行异步调用。下一次调用可以在此之后立即执行,并且在服务器执行“changerep”之前 - 调用

如果您必须确保订单,则需要实现异步回调:

http://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html

<强>更新

serverCall("firstaction",new AsyncCallback(){

    public void onSuccess(Void v /*or what ever*/){
        serverCall("secondaction" /*need firstaction to be finished*/, 
                   callBackForSecondaction);
    }

    public void onError(Exception e){
        // Make some errorhandling
    }
});

在这种情况下,只有第一个操作成功完成后才会执行第二个操作。在Java8之前,asynchrone代码看起来像回调的难题

答案 1 :(得分:1)

您应该为您对服务器发出的连续请求定义单独的回调。因为您永远不会知道首先处理哪个请求并返回给客户端。这取决于您在服务器端执行的处理类型。因此,要回答您的问题,回调不会按照它们在代码中出现的顺序实现。

作为提示,您的服务器调用方法应该是这样的:

void serverCall(String inputParam) {
   if(inputParam.startsWithText.equals("changeRep")
       processChangeRepInput(inputParam);
}

函数processChangeRepInput应该定义一个回调on onSuccess方法,你可以调用另一个方法,比如processGitInput(),它定义了自己的回调,在onSuccess方法中你可以调用任何下一个服务器你想要做的边数据库更新。