Вопрос

Существует массив объектов, которые расширяются с помощью параллельных ajax-запросов.Когда будет выполнен последний запрос, массив должен быть обработан.Единственное решение, которое я вижу, это:

function expandArray(objects, callback){
  number_of_requests=objects.length-1;
  for(i in objects){
    $.getJSON(request,function(){
                //expanding array           
                if(--number_of_reuests==0){
                  callback();
                }
              });
  }
}

Но поскольку запросы выполняются параллельно, существует вероятность возникновения состояния гонки.Переменная number_of_requests может редактироваться двумя "потоками" одновременно.Как избежать возникновения гоночных условий?

Это было полезно?

Решение

Можно ли переделать ваш AJAX так, чтобы все было в одном запросе? Эта часть системы будет самым большим узким местом и может стать хитрой (как вы узнали), поэтому чем меньше запросов вы сделаете, тем лучше.

Единственный другой способ, которым я мог бы подумать, был бы, если бы каждый запрос мутировал свой связанный объект, устанавливая значение флага или что-то еще, а затем вы перебирали все объекты, чтобы проверить, все ли флаги были установлены.

Другие советы

Разве Javascript не является однопоточным? Такое состояние, о котором вы говорите, не возникнет.

Это сложнее, но я бы предложил использовать третью функцию для мониторинга результатов.Что - то вроде этого:

1) Запустить монитор - используя соответствующий монитор интервалов (здесь важно использовать интервал для тестирования - простой цикл надежно заблокирует движок JS) результаты запросов A и B.

2) Запрос на вызов A.

3) Запрос на вызов B.

4) Запрос B завершен - функция обратного вызова устанавливает значение "B Все готово!".

5) Запросить завершение - функция обратного вызова устанавливает значение "Все сделано!".

6) Монитор распознает, что оба запроса выполнены, и вызывает функцию, которая использует данные от обоих.

Проще говоря, это "зависимости" (множественные вызовы) от "monitor" (функции, которая проверяет зависимости) до "completion" (действие, которое необходимо предпринять, когда все будет готово).

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

Вы можете расширять свои зависимости так далеко, как вам нравится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top