Безопасное обновление значений из асинхронного foreach? - PullRequest
1 голос
/ 19 декабря 2011

У меня асинхронный цикл forEach, проходящий через массив var anArray = [.....values inside...];

        anArray.forEach(function (s) {
           ...
        });

, а также 2 глобальные переменные, которые будут обновлены:

var count = 0;
var total = 0;

Во время foreach яБуду обновлять обе переменные.Поскольку foreach является асинхронным, я могу ожидать одновременного выполнения нескольких итераций.Это означает, что мои переменные могут быть перезаписаны.

Для count это нормально, так как все, что я делаю, это count ++ в каждом цикле.

Однако для total, по-другомузначения будут добавляться при каждом просмотре.

В любом случае я могу обеспечить обновление total без потери точности ??

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

В Javascript нет тем.«Асинхронный» просто означает, что он отправит событие в очередь, а затем оценит его, когда будет доступен основной поток.Следовательно, вы никогда не получите никаких проблем с синхронизацией в JS.

Например, если вы запустите:

setTimeout(function() {doSomeStuff1For(10secs)},1)
setTimeout(function() {doSomeStuff2For(20secs)},1)

Эти события будут выполняться следующим образом (учитывая, что 10-секундному вызову повезлобыть первым):

1 sec: doSomeStuff1
2 sec: doSomeStuff1
...
10 sec: ended doSomeStuff1
11 sec: started doSomeStuff2
...
30 sec: ended doSomeStuff2.
1 голос
/ 19 декабря 2011

Я думаю count++ работает так же, как total += 10, поэтому не будет никакой разницы. Но это все равно неважно. Javascript не выполняет код параллельно .

Смотри также: http://ejohn.org/blog/web-workers/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...