一段时间后冻结浏览器的Ajax请求

时间:2014-04-29 10:47:02

标签: javascript ajax html5

我已经设置了管理面板,其中使用ajax设置通知警报。它工作正常,但几分钟后开始冻结浏览器。不知道我做错了什么,因为这是我的第一个Ajax项目。

以下是我正在使用的代码,我在一个由body onload事件调用的函数中使用了setInterval。

<html>    
    <body onload="process()">
        <-- Some notification divs to be replaced by javascript -->
    </body>
<html>

的JavaScript

<script>
var xmlHttp = createXmlHttpRequestObject();

function process() {
    setInterval('process()', 10000);
    if (xmlHttp) {  
       try {
           xmlHttp.open("GET", "response.json", true);
           xmlHttp.onreadystatechange = handleRequestStateChange;
           xmlHttp.send(null);
       } catch (e) {
           console.log("Can't connect to server:\n" + e.toString())
       };
    }
}

            function handleRequestStateChange() {
                if (xmlHttp.readyState == 4) {
                    {
                        if (xmlHttp.status == 200) {
                            try {

                                handleServerResponse();

                            } catch (e) {}

                        } else {
                            console.log("There was a problem retrieving the data:\n" + xmlHttp.statusText);

                        }
                    }
                }
            }


            function handleServerResponse() {

                responseJson = JSON.parse(xmlHttp.responseText);
                for (var i = 0; i < responseJson.newbooking.length; i++) {

                    //   html += "<li><a href='admin_user.php?id=" +  + "'><div class='desc'>" + responseJson.users[i].first_name + ", " +responseJson.users[i].last_name + " joined</div></a></li>";

                    bookinghtml += "<li><a href='makeinvoice.php?bookingid=" + responseJson.newbooking[i].booking_id + "'><span class='subject'><span class='from'>" + responseJson.newbooking[i].company_name + " </span><span class='time'> " + responseJson.newbooking[i].user_name + " </span></span>";
                    bookinghtml += "<span class='message'> from " + responseJson.newbooking[i].start_date + ", " + responseJson.newbooking[i].batches + "  " + responseJson.newbooking[i].campaign + "</span></a></li>";
                }



                myDiv = document.getElementById("bookinginfo");
                myDiv.innerHTML = bookinghtml;


            }

1 个答案:

答案 0 :(得分:2)

每次发出请求时,都会告诉它每10秒发一次请求。

  1. 所以onload,你发出请求并启动计时器。
  2. 10秒后,您再次发出请求并启动另一个计时器。
  3. 10秒后,您发出两个请求,每个请求启动另一个计时器。
  4. 10秒后,您发出四个请求,每个请求启动另一个计时器。
  5. 等等。

    它开始冻结,因为它最终会尝试更快地发出请求,然后计算机才能处理。

    使用setTimeout,而不是setInterval

    (另外,你应该传递一个函数,而不是一个字符串:setTimeout(process, 10000));