2011-12-19 1 views
1

Я асинхронной Foreach зацикливание через массив var anArray = [.....values inside...];Безопасное обновление значений из асинхронного foreach?

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

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

var count = 0; 
var total = 0; 

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

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

Однако для total различные значения будут добавлены в течение каждого вида.

Есть ли в любом случае для меня, чтобы total был обновлен без потери точности ??

+0

Что вы имеете в виду с «точностью» ? Вы полагаетесь на порядок, в котором создается «total», что может вызвать проблемы с точностью, т. Е. 'A + b + c' или' c + b + a'? – pimvdb

+0

Что такое «асинхронный forEach»? – nnnnnn

+0

@nnnnnn извинения. Я предположил, что Array.forEach будет асинхронным, но после прочтения некоторых ответов здесь. Кажется, это не так! – tommi

ответ

2

Там нет потоков в 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

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

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

Смежные вопросы