1

你好我有这样的功能:

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

我该如何解决这个问题,我必须在回调结束后返回值。

4

3 回答 3

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) {
            }
        });
 }
于 2013-03-30T15:31:25.747 回答
2

也许更清洁的解决方案可能是在您获得结果时使用事件和事件总线(它可以是您的班级私有的,也可以由所有人共享,以便其他组件可以对此做出反应)。然后监听这些事件并相应地对待它们。

 getAllRecordFromServer(new SearchCallback() {

    @Override
    public void onSearchResult() {
        eventBus.fireEvent(new FoundEvent());
    }

    @Override
    public void onSearchError() {            
        eventBus.fireEvent(new NotFoundEvent());
    }
});
于 2013-04-03T12:06:17.357 回答
1
This code is not working properly ...

原因是您的代码在synchronous model并且您正在制作Asynchronous calls.

我假设你在得到一些结果后正在做某事onSearchResult

所以,在你得到服务器的响应之前停止执行你的代码,为什么因为你不知道调用有时会失败。

如果你真的想全局使用这个值,那么

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.
            }
        });
于 2013-03-30T19:36:55.800 回答