Как синхронизировать доступ к закрытым членам объекта javascript

У меня есть объект 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. Теперь я хочу вызвать ccStatTracker.modifyCCMap() из функции обработчика событий, прикрепленной к событию onEditCell. По мере того, как я буду изменять ячейки, это событие будет вызываться асинхронно, что, в свою очередь, вызовет функцию «modifyCCMap», которая изменит частный член «CCMap» моего объекта Javascript. Таким образом, последнее состояние моего CCMap, отображаемое двумя вызовами, может отличаться, верно? Итак, как лучше всего справиться с этим? Есть ли в Javascript что-то такое же «Синхронизированное», как в Java?

Пожалуйста, помогите мне, так как это определит подход, который мы хотим использовать для реализации этого.


person Shailesh Vaishampayan    schedule 09.06.2012    source источник
comment
ASAP больше не сделает как можно скорее :)   -  person Alexander    schedule 09.06.2012
comment
asynchronously не означает concurrently!   -  person Felix Kling    schedule 09.06.2012
comment
@ Александр Александр: хм. только что попробовал.   -  person Shailesh Vaishampayan    schedule 11.06.2012
comment
@Felix Kling: эта информация действительно полезна.   -  person Shailesh Vaishampayan    schedule 11.06.2012
comment
@Felix Kling: так что в приведенном выше сценарии, если пользователь продолжает редактировать ячейки, все запущенные обработчики событий будут запускаться один за другим (не одновременно), даже если они инициируются асинхронно !! Правильно?   -  person Shailesh Vaishampayan    schedule 11.06.2012


Ответы (1)


JavaScript является однопоточным (web-workers в сторону на мгновение), ничего не происходит асинхронно (или все, если на то пошло) — весь код: обработчики событий, тайм-ауты, обратные вызовы и т. д. — выполняются в одном потоке, один за другим.

Таким образом, вам не нужна синхронизация в JavaScript. Любой заданный фрагмент кода в JavaScript гарантированно будет выполняться только одним потоком. Как это круто?

Смотрите также

person Tomasz Nurkiewicz    schedule 09.06.2012
comment
поэтому в приведенном выше сценарии, если пользователь продолжает редактировать ячейки, все запущенные обработчики событий будут запускаться один за другим (не одновременно), даже если они инициируются асинхронно!! Правильно? - person Shailesh Vaishampayan; 11.06.2012
comment
@ShaileshVaishampayan: правильно. События будут поставлены в очередь и запущены одно за другим. Даже тайм-ауты, запланированные на одно и то же время, будут поставлены в очередь. - person Tomasz Nurkiewicz; 11.06.2012
comment
Во-первых, ECMAScript не требует выполнения JS в одном потоке. Во-вторых, setTimeout() и т. д. определяются HTML5, где четко определено, что обработчик действительно может работать в параллельном потоке: html.spec.whatwg.org/multipage/infrastructure.html#in-parallel - person fishbone; 30.04.2015
comment
@fishbone, так какие дополнительные меры предосторожности нам нужно принять? - person jack; 25.03.2020