我使用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()是不可接受的。
答案 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方法中你可以调用任何下一个服务器你想要做的边数据库更新。