代码之家  ›  专栏  ›  技术社区  ›  Anish Sana

JSNI-万美元。地方assign()未立即触发

  •  0
  • Anish Sana  · 技术社区  · 8 年前

    我的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() 这里执行的方法导致警报多次弹出,但我的问题是,为什么 万美元。地方分配(url) 直到最后一次才执行 onFailure() $wnd.alert() 就在它上面,每次都被执行?

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Anish Sana    8 年前

    根据 this answer ,浏览器将尝试执行剩余的JavaScript代码,直到页面被重定向;这解释了页面重定向之前出现多个警报的原因。

    为了避开这件事,我宣布 private static boolean redirect = false; . 当在JSNI代码中检测到URL重定向时,我检查 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);
    

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