我有两个函数,一个函数是一个重载函数,它执行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;
};
答案 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调用。