异步回调结束时gwt返回值

时间:2013-03-30 14:55:30

标签: java gwt gwt-rpc

你好我有这样的功能:

    @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中这样做:/ 此代码无法正常工作......因为您知道这是异步回调。

如何解决此问题我必须在回调结束后返回值。

3 个答案:

答案 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.
            }
        });