我在JavaScript中实现一个简单的记录器,当页面上发生某些事件时(单击一个按钮,更改DOM等)收集消息,并使用AJAX定期将所有收集的消息发送到服务器调用:
var Logger = function () {
var messages = [];
var flush = function () {
if (messages.length) {
$.post("receive-logs.php", { messages: messages.toString() });
messages = [];
}
};
return {
init: function () {
setInterval(flush, 5000);
},
addMessage: function (message) {
messages.push(message);
}
};
}();
Logger.init();
// Usage example:
// $("#button1").on("click", function () { Logger.addMessage("button1 clicked"); })
我在这个实现中关注的是消息是否会丢失"丢失"如果在addMessage
之后但在$.post
之前调用messages = []
。
在许多文章中我都读到JavaScript在单线程环境中运行,因此开发人员永远不必担心锁定或并发控制等问题。这令人困惑,因为我认为没有理由说明上述情况是不可能的。
我的问题是:在这种情况下邮件是否可能丢失,我该如何避免?