2012-02-03 3 views
1

У меня есть две функции, одна функция - функция перезагрузки, которая выполняет веб-вызов ajax для получения данных. другой - загрузчик товаров, который загружает данные. Проблема в том, что функция, загружающая элемент данных, еще не имеет значения из-за сделанного вызова ajax. Во всяком случае, это исправление, помимо вызова setTimeout? Заранее благодарю за любую помощь.javascript Вопрос о состоянии гонки

function reload(index) { 
    _ListData[index] = null; 
    DisplayInformation.GetTemplateTableInformation(
     ListManager.listReportId(), 
     ListManager.listParameters(), 
     ListManager.listSortParams(), 
     TableReportHelper_TemplateRelatedAction, 
     reloadRange.min, 
     reloadRange.num, 
     function(templateItemIfo) {//success callback causes issues with race conditon in the function itemLookaheadCallback because _ListData[index] = null; 
      itemLookaheadCallback(templateItemIfo, index); 
     }); 
} 

Вот функция, которая пытается загрузить элемент, который был назван в перегрузочной обратного вызова

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    //Store the received value 
    var item = _ListData[index];//this will be null because of _ListData[index] = null; 
    item.data = lookAheadData.TemplateInformation; 

}; 
+1

Вы могли бы уменьшить свой код до самого важного вопроса? –

+0

+1 до выше. Отсутствует контекст. Опишите эту проблему более общим образом. –

+0

Извините, что я немного уменьшил код в строке var item = _ListData [index]; будет null, и это проблема. функция reload callback itemLookaheadCallback не устанавливает индексный элемент достаточно быстро. – user516883

ответ

2

Поместите код для загрузки элементов внутри «успех обратного вызова».

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

-1

Вы можете сделать синхронный вызов, используя async = False в своем вызове ajax. например:

$.ajax({ 
      type: 'GET', 
      url: '/yourUrl/', 
      dataType: 'json', 
      success: function(data) { 

      }, 
      data: {}, 
      async: false 
     }); 

p.s .: Использование jQuery для вызова Ajax здесь.

+0

[** Никогда ** делать синхронный вызов AJAX.] (Http://stackoverflow.com/a/7337091/201952) – josh3736

+0

@ josh3736 Почему? Никогда не делайте такого сильного окончательного заявления без объяснения! – Sid

+0

Нажмите на ссылку. Синхронизация вызывает замораживание пользовательского интерфейса браузера, что смущает плохой UX. – josh3736

0

Я знаю, что это похоже на состояние гонки, но я собираюсь выйти на конечность и предположить, что это на самом деле проблема с областью.

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

function reload(index) { 
    _ListData[index] = null; 
    ... 
} 

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

reload -> itemLookaheadCallback -> loadDataCallback 

Решение? Рассмотрите возможность использования window, чтобы определить глобально доступное местоположение для этой переменной. (window всегда является глобальным).

Вот те изменения, которые сделали бы это случилось:

function reload(index) { 
    window._ListData[index] = null; 
    ... 
} 

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    var item = window._ListData[index]; 
    ... 
}; 

Во всяком случае, это только предположение. Возможно, неправильно, но относительно легко проверить.

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