Javascript 未调用XMLHttpRequest onload

Javascript 未调用XMLHttpRequest onload,javascript,post,get,xmlhttprequest,Javascript,Post,Get,Xmlhttprequest,我对JS很陌生。 据我所知,在函数createNewGetXHR()中创建的XMLHttpRequest的新实例必须在发送请求后启动onload回调函数。现在它可以在不触发回调的情况下工作。但是,如果我在postData()中的循环(字符串55和63)开始工作时注释do(如何在循环中创建新的GET请求,以便控制该循环的退出 <script> function sleep(ms) { ms += new Date().getTime();

我对JS很陌生。 据我所知,在函数
createNewGetXHR()
中创建的
XMLHttpRequest
的新实例必须在发送请求后启动
onload
回调函数。现在它可以在不触发回调的情况下工作。但是,如果我在
postData()中的循环(字符串55和63)开始工作时注释do(如何在循环中创建新的GET请求,以便控制该循环的退出

    <script>
        function sleep(ms) {
            ms += new Date().getTime();
            while (new Date() < ms){}
        }
        function createNewGetXHR(uniqId, server_state) {
            alert("In createNewGetXHR()");
            var url = "http://localhost:8080/api/users?uniqId=" + uniqId;
            var xhr = new XMLHttpRequest();

            xhr.open("GET", url, true);
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.onload = function () {
                alert("Fired onload callback");
                if (xhr.readyState === xhr.DONE) {
                    if (xhr.status === 200) {
                        var server_resp = xhr.responseText;

                        alert("server_resp: " + server_resp);
                        if (server_resp !== "-") {
                            server_state.working = false;
                            server_state.response_html = server_resp;
                        }
                    }
                }
            };

            return xhr;
        }
        function postData() {
            // Get data from froms
            var name = document.getElementById('name').value;
            var surname = document.getElementById('surname').value;
            var action = document.getElementById('action').value;
            // Make json from data
            var data = JSON.stringify({"action": action, "user": {"name": name, "surname": surname}});
            // Prepare request
            var url = "http://localhost:8080/api/users";
            var xhr = new XMLHttpRequest();

            xhr.open("POST", url, true);
            xhr.setRequestHeader("Content-Type", "application/json");
            // Handle server response
            xhr.onload = function () {
                if (xhr.readyState === xhr.DONE) {
                    if (xhr.status === 200) {
                        alert("Server is working. Please wait for the answer!");

                        var REFRESH_RATE = 2000;
                        var uniqId = xhr.responseText;
                        var server_state = { working: true, response_html: "default" };
                        var reqs_holder = [];

                        // Checking for the server answer every $REFRESH_RATE
                        do { // (1) if comment out it - code start working(once)
                            sleep(REFRESH_RATE);

                            var new_req = createNewGetXHR(uniqId, server_state);

                            reqs_holder.push(new_req);
                            new_req.send();
                            //alert("Send GET");
                        } while (server_state.working); // (2) if comment out it - code start working(once)

                        document.write(result_html);
                    }
                }
            };
            // Make post request
            xhr.send(data);
        }
    </script>

功能睡眠(ms){
ms+=新日期().getTime();
而(新日期()
据我所知,当代码在循环中旋转时,像
onload
这样的回调不会执行。因为循环的退出条件是在回调中设置的,所以我们得到一个无限循环。解决方案是一个尾部递归函数,如果服务器仍然没有处理请求,它会在延迟后调用自己。

    <script>
        function sleep(ms) {
            ms += new Date().getTime();
            while (new Date() < ms){}
        }
        function waitForResponse(uniqId, refresh_rate) {
            var url = "http://localhost:8080/api/users?uniqId=" + uniqId;
            var xhr = new XMLHttpRequest();

            xhr.open("GET", url, false);
            xhr.onload = function () {
                if (xhr.readyState === xhr.DONE && xhr.status === 200) {
                    var server_resp = xhr.responseText;

                    if (server_resp === "-") {
                        sleep(refresh_rate);
                        waitForResponse(uniqId, refresh_rate);
                    }
                    else
                        document.write(server_resp);
                }
            };
            xhr.send();
        }
        function postData() {
            /* Get data from froms the forms */
            var name = document.getElementById('name').value;
            var surname = document.getElementById('surname').value;
            var action = document.getElementById('action').value;
            var data = JSON.stringify({"action": action,
                "user": {"name": name, "surname": surname}}); // make json from data

            /* Prepare request */
            var url = "http://localhost:8080/api/users";
            var xhr = new XMLHttpRequest();

            xhr.open("POST", url, true);
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.onload = function () { // handle server response
                if (xhr.readyState === xhr.DONE && xhr.status === 200) {
                    alert("Server is working. Please wait for the answer!");

                    var REFRESH_RATE = 1000;
                    var uniqId = xhr.responseText;

                    waitForResponse(uniqId, REFRESH_RATE);
                }
            };
            xhr.send(data); // make post request
        }
    </script>

功能睡眠(ms){
ms+=新日期().getTime();
而(新日期()
睡眠(刷新率);
太可怕了,它所做的只是锁定浏览器,使其无法执行任何操作