当两个javascript事件试图同时修改同一个变量时会发生什么

时间:2013-06-19 13:01:22

标签: javascript

有一个javascript代码,其变量messageList保留了邮件列表,可以通过函数updateMessageList()进行更新,如下所示:

var messageList=[];                           //contains list of messages
function updateMessageList(id, lastUpdate);   //updates messageList item for given id

//at some point while running
mesasgeList=[
    {id:1, lastUpdate:1371650818000},
    {id:2, lastUpdate:1371650821000},
    .....
]

如果两个不同的来源同时为同一updateMessageList()项调用messageList函数,会发生什么情况。假设id:1的消息的一个更新来自客户端(当前用户更新消息),另一个来自服务器的更新也来自id:1的消息(另一个用户更新消息)。然后他们会同时尝试访问和修改messageList[0].lastUpdate属性。

在源1中:当客户端更新消息表单时,提交事件会触发函数handleReply()

function handleReply(event) {
    .....
    var id=event.currentTarget.find('input[name="id"]').val();
    //form has an hidden input for id of the message
    var d = new Date();
    updateMessageList(id, d.getTime());
    .....
}

在Source 2中:JS对服务器进行AJAX调用以检查是否有任何更新,而不是运行updateMessages()函数作为回报

//server sends following JSON data:{id:1, lastUpdate:1371650823269}
function updateMessages(data) {
    .....
    updateMessageList(data.id, data.lastUpdate);
    .....
}

updateMessageList()函数都会尝试更改lastUpdate的{​​{1}}属性。

我们应该在编程时考虑这些情况,还是javascript可以处理这些情况?

1 个答案:

答案 0 :(得分:6)

Javascript是单线程的。在javascript中没有并发性这样的东西。一次通话总是在另一次之前或之后。也许它可以相差一毫秒,但是一个调用将在另一个调用开始之前退出它。