1

有一个 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属性。

In Source 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());
    .....
}

在源代码 2 中:JS 对服务器进行 AJAX 调用以检查是否有任何更新,然后运行updateMessages()函数作为返回

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

这些函数都updateMessageList()将尝试更改lastUpdate.messageList[0]

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

4

1 回答 1

6

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

于 2013-06-19T13:02:17.507 回答