javascript Проблема состояния гонки - PullRequest
1 голос
/ 03 февраля 2012

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

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;

};

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

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

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

0 голосов
/ 03 февраля 2012

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

_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];
    ...
};

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

0 голосов
/ 03 февраля 2012

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

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

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

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

...