JSNI - $ wnd.location.assign()不会立即触发

时间:2018-01-14 16:53:51

标签: javascript java gwt xmlhttprequest jsni

我的GWT应用程序中有以下JSNI代码,它发出HTTP请求来检测URL重定向 -

private native void checkSession(String url)
    /*-{
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(e) {
                if (xhr.readyState == 4) {
                    if (url != xhr.responseURL) {
                        $wnd.alert("Your session has timed out.");
                        $wnd.location.assign(url);
                    }
                }
            }
            xhr.open("GET", url, true);
            xhr.send();
    }-*/;

如果请求的URL与响应URL不同,则会话被视为超时;我想在其上显示一个警告框,让用户知道会话已经超时,并在他们点击确定时启动重定向。

我有一个实现AsyncCallback的自定义类。使用this technique,我可以全局强制onFailure()checkSession()发生时致电StatusCodeException

问题是警告框会在$wnd.location.assign(url)启动重定向之前弹出几次。我意识到这里正在执行几个onFailure()方法导致警报多次弹出,但我的问题是,为什么$wnd.location.assign(url)在执行最后一个onFailure()方法之前没有被执行,而$wnd.alert()正好在它之上,每次都被执行?

如何在这种情况下强制重定向?理想情况下,我希望警报弹出一次,并在点击OK后立即重定向。

1 个答案:

答案 0 :(得分:1)

根据this answer,浏览器将尝试执行剩余的JavaScript代码,直到重定向页面为止;这解释了在页面重定向之前发生多个警报。

为了解决这个问题,我宣布private static boolean redirect = false;。 在JSNI代码中检测到网址重定向时,我会检查redirect是否为false,如果是,我会显示提醒并设置redirect = true -

if (@fully.qualified.name::redirect == false) {
       @fully.qualified.name::redirect = true;
       $wnd.alert("Your session has timed out.");
}
$wnd.location.assign(url);

这样,我就可以在启动重定向之前只显示一次警报。