我正在构建一个跟踪库来将事件发送到后端。应该每5秒创建一个事件(可配置)并将其发送到跟踪队列中,并且应将跟踪队列发送到后端并每5秒清空一次(也可配置)。预期的行为是应该每5秒发送一次事件到后端。异步xhr请求内setInterval不工作| Javascript
当我只是console.logging事件,一切都按预期工作,但是当我实现了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);
}
后端正在接收数据,但没有在正确的时间。 sendData从setInterval循环中调用。
setInterval(function(){
self.sendData()
}, 5000);
我有同样的设置完美的工作之前,在使用axios另一个文件,但我不能在这个用例使用Axios公司。
你试过只调用'sendData()'而不是'self.sendData()'吗? – brk
'Tracking .__ tracking_queue = [];'似乎在错误的位置被调用。如果在构建数据和返回Ajax调用之间添加了某些内容,则会丢失数据。 – epascarello
创建一个重现问题的演示。这些函数还应该在一个对象变量内部添加一些错误处理 – charlietfl