你好我有这样的功能:
@Override
public boolean checkExist(String name) {
final boolean check[] = new boolean[] { false };
getAllRecordFromServer(new SearchCallback() {
@Override
public void onSearchResult(Map<String, Item> itemsMap) {
//do some action set true when map key equals name
check[0] = true;
}
@Override
public void onSearchError(XMLPacket error) {
// TODO Auto-generated method stub
}
});
return check[0];
}
我正在寻找解决方案并找到一些文章,但我不知道如何在gwt中这样做:/ 此代码无法正常工作......因为您知道这是异步回调。
如何解决此问题我必须在回调结束后返回值。
答案 0 :(得分:6)
无法像您一样在方法中返回异步调用中的值。这是“异步”调用的基本特性。你永远不知道什么时候会返回(网络/服务器延迟),因此你的代码执行不会等待!!!!!
不要从方法返回布尔值。而是让您的方法进行回调。
interface MyCallback {
execute(boolean successfl);
}
public void checkExist(String name, MyCallback callback) {
getAllRecordFromServer(new SearchCallback() {
@Override
public void onSearchResult(Map<String, Item> itemsMap) {
//do some action set true when map key equals name
callback.execute(true);
}
@Override
public void onSearchError(XMLPacket error) {
}
});
}
答案 1 :(得分:2)
也许更清晰的解决方案可能是使用事件和事件总线(可能是您的班级私有或可能由所有人共享,以便其他组件可以对此做出反应)当您获得结果时。然后听取这些事件并相应地对待它们。
getAllRecordFromServer(new SearchCallback() {
@Override
public void onSearchResult() {
eventBus.fireEvent(new FoundEvent());
}
@Override
public void onSearchError() {
eventBus.fireEvent(new NotFoundEvent());
}
});
答案 2 :(得分:1)
This code is not working properly ...
原因是您的代码位于synchronous model
,而您正在制作Asynchronous calls
。
我假设你在onSearchResult
得到一些结果后正在做某事。
所以,停止执行代码,直到你收到服务器的响应,为什么,因为你不知道callmay会在某个时候失败。
如果您真的想全局使用该值,那么
public boolean returnVal=false;
public void checkExist(String name, MyCallback callback) {
getAllRecordFromServer(new SearchCallback() {
@Override
public void onSearchResult(Map<String, Item> itemsMap) {
returnVal=true;
proceedFurther(itemsMap) //your next lines of code in this method.
}
@Override
public void onSearchError(XMLPacket error) {
stopProceedFurther(); //show some error message to user.
}
});