2017-04-10 87 views
1

我正在构建一个跟踪库来将事件发送到后端。应该每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公司。

+0

你试过只调用'sendData()'而不是'self.sendData()'吗? – brk

+1

'Tracking .__ tracking_queue = [];'似乎在错误的位置被调用。如果在构建数据和返回Ajax调用之间添加了某些内容,则会丢失数据。 – epascarello

+0

创建一个重现问题的演示。这些函数还应该在一个对象变量内部添加一些错误处理 – charlietfl

回答

1

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

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

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

谢谢,那正是问题所在。 – dedles