setInterval中的异步xhr请求不起作用使用Javascript

时间:2017-04-10 14:07:32

标签: javascript asynchronous xmlhttprequest setinterval

我正在构建跟踪库以将事件发送到后端。应每5秒创建一个事件(可配置)并将其发送到跟踪队列,并将跟踪队列发送到后端并每5秒清空一次(也可配置)。预期的行为是应该每5秒向后端发送一个事件。

当我只是控制台。记录事件时,一切都按预期工作,但是当我实现xhr请求时,间隔事件仅每9秒创建一次。因此,事件将被发送到后端,每两次只发送一次' post'功能被解雇。

sendData: function(){
    var toSend = [].concat(Tracking.__tracking_queue);
    if(toSend.length !== 0){
        var sendData = this.__stringifyAndSetHeaders(toSend);
        Tracking.postData(sendData);
    }
},

postData: function(sendData){
    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        console.log(xhr.responseText);
        Tracking.__tracking_queue = [];
    };
    xhr.open("POST", sendData.url, true);
    Object.keys(sendData.headers).forEach(function(key){
        xhr.setRequestHeader([key], sendData.headers[key]);
    });
    xhr.send(sendData.body);
}

后端正在接收数据,但不是在正确的时间。正在从setInterval循环中调用sendData。

    setInterval(function(){
        self.sendData()
    }, 5000);

我之前在使用axios的另一个文件中完成了相同的设置,但是在这个用例中我无法使用axios。

1 个答案:

答案 0 :(得分:1)

您正在错误的位置重置跟踪数据。读取数据,而不是发出请求,请求完成后,删除数据。有一段时间,数据可以在请求和完成之间进入队列。

var randomName = Guid.NewGuid().ToString():
var fullPath = Path.Combine(dicompath, randomName);
Directory.CreateDirectory(fullPath);
finalpath = port + " -pm" + " --fork " + " -aet " + AE +" " + "-od " + ((char)34) + fullPath + ((char)34);
//.... rest of your code....