重复XMLHttpRequest

时间:2018-10-11 15:29:57

标签: javascript xmlhttprequest

在我问这里之前,我已经在寻找问题了,但是我仍然找不到答案,这可能是我的错误或其他我做错的事情。

问题是我想向XMLHttpRequest服务器发出一个localhost请求,但是在请求完成后,我想对相同的目标/ URL发出相同的XMLHttpRequest请求示例如下action/g

req.repeat = function(rnd = null) {
    if(rnd == null) {
        rnd = getrandint();
    }

    var data;

    data = new FormData();
    data.append('data', 'hay');

    if(isset(xhr[rnd]) && xhr[rnd] == window.XMLHttpRequest) {
        xhr[rnd].abort();
    }

    xhr[rnd] = new XMLHttpRequest();
    xhr[rnd].open('POST', url+'action/g', true);
    xhr[rnd].onreadystatechange = function() {
        if(this.readyState == 4) {
            req.repeat(rnd);
        }
    }
    xhr[rnd].send(data);
}

我认为代码运行良好,但是如果XMLHttpRequest请求仅花费10毫秒即可从服务器获得响应,则该功能将每10毫秒快速重复一次。

在再次执行setTimeout()之前,我尝试使用req.repeat()处理此问题,但是我想那不是正确的方法。原因是,如果XMLHttpRequest请求花费了3000毫秒,而我将setTimeout()加了1000毫秒,那么XMLHttpRequest只会每隔4000毫秒重复一次,这对我来说很慢。

如果XMLHttpRequest请求花费1200ms来从服务器获取响应,而我希望重复执行的时间大于1000ms,我想在1000ms处不断进行重复。

但是,即使使用setInterval(),我也找不到办法。

有关信息 var xhr = new Array();位于函数外部。

请帮助,我对您的任何建议

1 个答案:

答案 0 :(得分:0)

我已经找到了自己的问题的答案,而无需使用任何websocket,在这里是代码。

req.repeat = function(code = 0) {
    var time;
    var code, parent;

    time = new Array();
    while(code == 0) {
        code = getrandint();
    }

    return {
        execute: function(par, url, fun) {
            var data, lim;

            lim = 1500; // in miliseconds

            data = new FormData();
            data.append('data', par);

            if(xhr[code] == window.XMLHttpRequest) {
                xhr[code].abort();
            }

            xhr[code] = new XMLHttpRequest();
            xhr[code].open('POST', meurl+'url', true);
            xhr[code].onreadystatechange = function() {
                if(xhr[code].readyState == 4) {
                    time['last'] = new Date();
                    time['diff'] = time['last'].getTime()-time['begin'].getTime();

                    if(isfun(fun)) {
                        fun(xhr[code]);
                    }

                    parent = new req.repeat(code);

                    if(time['diff'] > lim) {
                        parent.execute(par, url, fun);
                    } else {
                        tim = setTimeout(function() {
                            parent.execute(par, url, fun);
                        }, lim-time['diff']);
                    }
                }
            }
            time['begin'] = new Date();
            xhr[code].send(data);
        }
    }
}

谢谢您的帮助,但是当我阅读websocket可以更好地完成这项工作时,但是我仍然在学习websocket解决方案。