javascript竞争条件问题

时间:2012-02-03 16:15:11

标签: javascript ajax callback race-condition

我有两个函数,一个函数是一个重载函数,它执行ajax web调用来获取数据。另一个是加载数据的项目加载器。问题是由于进行了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 个答案:

答案 0 :(得分:2)

将代码加载到“成功回调”中的项目。

或者,使AJAX调用同步,尽管应该避免这种情况,因为在慢速连接或大量数据时,它可能看起来像页面已冻结。

答案 1 :(得分: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];
    ...
};

无论如何,这只是猜测。可能是错误的,但相对容易验证。

答案 2 :(得分:-1)

您可以在ajax调用中使用async = False进行同步调用。例如:

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

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

p.s。:使用jQuery在这里进行Ajax调用。