2012-03-08 67 views
0

我在听一个窗口关闭事件:GWT RPC可能在窗口关闭处理程序中?

closeHandlerReg = Window.addCloseHandler(new CloseHandler<Window>() { 
    @Override 
    public void onClose(CloseEvent<Window> event) { 
    // ... 
    } 
}); 

文档说没有UI可以在回调中显示。关于GWT RPC调用呢?我试图做一个,但它没有显示在服务器上(无论是在断点或日志语句)。

回答

2

问题是GWT RPC是异步的,并且RPC服务调用立即返回。在这种情况下,窗口在浏览器有机会发送底层XMLHTTPRequest之前关闭。

如果这是绝对必要的,你应该可以用“同步”XMLHTTPRequest来手动调用某种类型的servlet(而不是GWT RPC)。看看这里的一个例子:http://weblogs.asp.net/bleroy/archive/2005/12/15/433278.aspx

不过说真的,你不应该在window.onunloadwindow.onbeforeunload(这些是和的closeEvent为ClosingEvent窗口底层的DOM事件或许还有更好的做这种事情。方法来做你正在尝试做的事

+0

我想通知服务器连接正在关闭。你有一个替代方法的建议吗? – 2012-03-09 02:44:44

+1

没有“连接”。这不仅仅是Web应用程序的工作方式。但是如果你不能想到另一种方式来实现你想要的而不需要联系服务器,你可以尝试我提供的同步XMLHTTPRequest例子。它不能用GWT RPC完成。 – Strelok 2012-03-09 04:39:25

+0

好吧,如果我使用网络套接字,还有更多的连接感,是不是? – 2012-03-09 16:47:12

2

你应该有可能的用例当你在closeHandler中进行RPC调用时,它应该到达服务器,因为当它直接返回时,它已经开始发送数据,然后设置一个回调来等待结果,但是回调会失败,因为连接丢失是因为窗口关闭了,但这不是问题,因为你只想通知服务器,所以问题可能是你是什么发送?a nd它是否可以工作,当你在代码中的其他位置发送它时,而不是在closeHandler中?

+0

我只是试图发送用户正在离开页面的通知。你是对的,我不关心回调。 GWT RPC调用在代码中的其他位置正常工作。 – 2012-03-09 16:50:43

+1

在我们的例子中,有时会调用服务器 - 大概取决于必要的对象是否已被销毁。添加一个“你确定要离开页面”对话框给它足够的时间来成功发送呼叫(使用Window.addWindowClosingHandler并将event.setMessage(...)设置为任何字符串)。不幸的是,这不是一个好的解决方案,因为额外的点击会变得非常烦人。我不知道如何让对话在短时间后自动隐藏。 – 2013-01-09 01:31:26