JavaScript асинхронное состояние гонки - PullRequest
4 голосов
/ 10 сентября 2009

Существует массив объектов, которые расширяются параллельными запросами 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 может редактироваться двумя «потоками» одновременно. Как избежать шансов на гонку?

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

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

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

1 голос
/ 10 сентября 2009

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

0 голосов
/ 10 сентября 2009

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

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

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

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

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

5) Запрос A завершается - функция обратного вызова устанавливает «A All Done!» значение.

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

Проще говоря, это «зависимости» (множественные вызовы) от «контроля» (функция, проверяющая зависимости) до «завершения» (действие, которое нужно выполнить, когда все будет готово).

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

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

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