如何同步访问JavaScript对象的私有成员

12

我有一个JavaScript对象,它是这样创建的:

var ccStatTracker = (function (){
  ccmap:{
    "1":["1","2","3","4"],
    "2":["4","5"];       
  }

  return {
    modifyCCMap: function (){
      // Code which takes following actions: 
      // - adds/removes keys.
      // - modifies arrays stored as values against the keys in the map.  
    }  
  }
)();
我有一个DHTMLXGrid组件,它以行和列的形式显示网格。当我编辑网格中的任何单元格时,会调用"onEditCell"事件。现在,我想从与"onEditCell"事件处理程序函数相关联的事件处理程序函数中调用ccStatTracker.modifyCCMap()。随着我继续修改单元格,这个事件将异步地被调用,这将反过来调用一个名为"modifyCCMap"的函数,该函数将修改我的Javascript对象的私有成员"CCMap"。因此,两次调用所看到的我的CCMap的最新状态可能是不同的,对吗?那么处理这种情况的最佳方法是什么?JavaScript中是否有像Java中的"Synchronized"一样的东西呢?
请帮助我,因为这将决定我们实现这个功能的方法。

尽快完成不会让它更加尽快 :) - Alexander
1
“异步”并不意味着“并发”! - Felix Kling
@Alexander:嗯,刚试了一下。 - Shailesh Vaishampayan
@Felix Kling:这条信息真的很有帮助。 - Shailesh Vaishampayan
@Felix Kling:所以在上述情况下,如果用户继续编辑单元格,则所有触发的事件处理程序将依次运行(而不是并发运行),即使它们是异步启动的!!对吗? - Shailesh Vaishampayan
1个回答

29

JavaScript是单线程的(除了),所有代码:事件处理程序、超时、回调等都在同一线程中一个接着一个地运行。

因此,在JavaScript中不需要任何同步。任何给定的JavaScript代码片段都保证只被单个线程执行。多么酷!

另请参阅


1
在上述情况下,如果用户继续编辑单元格,则所有触发的事件处理程序将依次运行(而不是并发运行),即使它们是异步启动的!对吗? - Shailesh Vaishampayan
1
@ShaileshVaishampayan:正确。事件将被排队并一个接一个地触发。即使在同一时间安排触发的超时也会排队等待。 - Tomasz Nurkiewicz
5
首先,ECMAScript并不要求JavaScript必须在单个线程中执行。其次,setTimeout()等函数是由HTML5规定的,其中明确定义了处理程序确实可以在并行线程中运行:https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel。 - fishbone
3
@fishbone,那么我们需要采取哪些额外的预防措施? - jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接