xmlhttprequest重复自己

时间:2014-05-14 11:37:13

标签: javascript xmlhttprequest repeat

我正在向node.js服务器发出xmlhttprequest。请求后,服务器联系远程服务器以执行处理并将结果返回给浏览器。问题是当处理需要很长时间(几分钟)时,浏览器向服务器发出第二个请求。我已经尝试将超时xmlhttprequest属性更改为10分钟(处理时间较短,可能是4分钟),但我仍然会重复请求(这发生在chrome和firefox中)。这是我的http请求代码(fd是一个formdata对象):

var request = new XMLHttpRequest();
request.onretry = function () { alert("Retrying...") }

request.onreadystatechange=function()
{
    if (request.readyState == 4)
    {
        document.getElementById("progress_div").style.display='none';
        document.getElementById("classifybutton").disabled = false;
        if (request.status >= 200 && request.status < 300)
        {
            var res = JSON.parse(request.response);
            // DISPLAY RESULTS
        }
        else
        {
            var res = JSON.parse(request.response);
            alert("Error: " + res.error);
        }
    }
}

request.onerror=function()
{
    document.getElementById("progress_div").style.display='none';
    document.getElementById("classifybutton").disabled = false;

    alert("There was an error contacting the server");
}

request.open('POST', '/sendall', true);
request.timeout = 600000;

request.ontimeout = function () { alert("Timed out!!!"); }

request.send(fd);

请注意,不会调用ontimeout,onretry或onerror函数。这可能是在函数之前产生的(即按下按钮时调用中的某种方式)?

发现问题(我无法等待8小时回答我自己的问题所以这是解决方案):

原来问题不在于客户端与node.js服务器的关系。默认情况下,它会在2分钟后超时套接字,因此客户端会复制请求。要更改此添加:

.on('connection', function(socket) {
    socket.setTimeout(20 * 60 * 1000); // set to a 20 min timeout
})

到server.createServer(有关详细信息,请参阅http://nodejs.org/api/http.html#http_server_timeout)。

2 个答案:

答案 0 :(得分:0)

试试这个检查this.status == 200

request.onreadystatechange=function()
{
    if (request.readyState == 4 && this.status == 200)
    {
        document.getElementById("progress_div").style.display='none';
        document.getElementById("classifybutton").disabled = false;
        if (request.status >= 200 && request.status < 300)
        {
            var res = JSON.parse(request.response);
            // DISPLAY RESULTS
        }
        else
        {
            var res = JSON.parse(request.response);
            alert("Error: " + res.error);
        }
    }
}

答案 1 :(得分:0)

原来问题不在于客户端与node.js服务器的关系。默认情况下,它会在2分钟后超时套接字,因此客户端会复制请求。要更改此添加:

.on('connection', function(socket) {
    socket.setTimeout(20 * 60 * 1000); // set to a 20 min timeout
})

到server.createServer(有关详细信息,请参阅http://nodejs.org/api/http.html#http_server_timeout)。