有一个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可以处理这些情况?
答案 0 :(得分:6)
Javascript是单线程的。在javascript中没有并发性这样的东西。一次通话总是在另一次之前或之后。也许它可以相差一毫秒,但是一个调用将在另一个调用开始之前退出它。