2014-01-21 3 views
3

У меня есть угловое приложение, которое выполняет множество асинхронных вызовов с использованием $ http.get, и у меня есть переменная count в моей области ($ scope.count), которая отслеживает, сколько запросов я сделал и сколько все еще находятся на рассмотрении. Очевидно, что я использую его следующим образом:Параллелизм в Angularjs

  • Перед тем, как сделать запрос на $ http.get я увеличиваю счетчик на 1
  • Когда я получаю ответ от $ http.get Я уменьшаем счет на 1

Я делаю много запросов, что-то около 2000 запрашивает все одновременно, но значение $ scope.count не возвращается к 0 даже после того, как все запросы выполнены, это всегда больше 0 (всегда выключено на 1 или 2). Я обрабатываю как события успеха, так и ошибки для моего вызова $ http.get, и я уменьшаю счет, когда происходит одно из них.

Так что мне было интересно, хорошо ли угловой/javascript обрабатывать параллелизм? Я думаю, что я запускаю операцию инкремента так много раз (потенциально много одновременно), а значение $ scope.count становится устаревшим/плохим, так как две операции могут одновременно изменять переменную.

+0

unpossible, JavaScript работает однопоточный. могут быть кэшированы. как вы рассчитываете? Потому что это должно быть с [перехватчиком] (http://docs.angularjs.org/api/ng.$http) – calebboyd

+0

Я делаю $ scope.count + = 1 перед каждым запросом и $ scope.count - = 1 после каждого ответа – Marc

+0

Вы можете распечатать начало, успех, ошибку и подсчитать до консоли. Затем наблюдайте, что происходит. – allenhwkim

ответ

4

Javascript запускает однопоточный (цикл событий), поэтому проблема параллелизма невозможна.

Что вы должны сделать, это использовать перехватчик. Документация отличная example.

Вы можете поставить счетчик на $rootScope

+0

Где я могу прочитать, как JS фактически выполняет обещания в цикле событий? Например, теоретически возможно, если не будет гарантировано иначе, что в середине функции она приостановлена, а другая будет запущена, то первая будет возобновлена. Кроме того, если обещания JS запускаются поодиночке, то это должно быть неправильно, что $ q.all от Angular выполняет свои обещания параллельно. Но в этом случае такие вопросы, как http://stackoverflow.com/questions/34186545/how-can-i-limit-angular-q-promise-concurrency#, не имеют смысла. Или выполнение фактически происходит параллельно, если оно выполняется не в браузере, а, скажем, node.js? –

+1

Вы можете прочитать об этом [здесь] (https://github.com/getify/You-Dont-Know-JS/blob/master/async%20&%20performance/ch1.md#event-loop) – calebboyd

+1

Спасибо! Поэтому, если я прав, JS-код работает одновременно с другим JS-кодом **, но ** не-JS-активность, такая как XHR-связь, может фактически выполняться одновременно средой хостинга. Так, например, запрос async XHR может быть запущен одновременно с JS-кодом, тогда его обратный вызов положительно запускается не одновременно с JS-кодом. –