我在遇到条件之前执行的if语句中遇到问题。我想做的是:
这是代码(删除了许多可读的细节
var all_data={};
function get_data(name,rid) {
if (!all_data[name]) {
return $.get('/data.json',
{'name':name},
function(data) {all_data[name]=data;},
"json");
} else {return true}
}
function load_file(name,rid) {
if (get_data(name,rid)) { alert(all_data[name]) };
}
上面的代码会发生什么,当我执行get_data时,它立即警告“未定义”,因为jQuery.get正在返回一个(尚未完成的)请求对象。此时,条目all_data [name]未定义。如果我等待〜5s,则get请求完成,并且再次运行代码将仅提醒“[Object Object]”,因为数据已加载。我意识到我可以在$ .get回调和else语句中添加一个函数,但这会使它不再泛化。有什么想法吗?
克里斯
答案 0 :(得分:2)
将数据作为回调函数加载到load_file
本身,将需要发生的事情传递给它。这是一个通用解决方案,因为如果数据已经可用,则立即调用回调,否则在数据可用时调用它。
还尝试在每个函数中使用全局状态all_data
。尽可能将范围限制在每个函数的本地。
有其他方法可以提供流畅的界面,但是在加载后不知道你对数据做了什么,很难建议。
function load_file(name, rid, fn) {
get_data(name, rid, fn);
}
load_file("..", "..", function() {
alert(all_data[".."]);
});
get_data
函数变为:
function get_data(name, rid, fn) {
if (!all_data[name]) {
return $.get('/data.json',
{'name':name},
function(data) { all_data[name]=data; fn(); },
"json");
} else { fn(); }
}
答案 1 :(得分:0)
正如其他人所说,问题是$ .get()函数是异步的,它会立即返回。您可以使用以下命令创建同步请求,它将执行预期的操作。
function get_data(name,rid) {
if (!all_data[name]) {
var result = $.ajax({ async: false,
url: '/data.json',
data: {'name':name},
dataType: "json"
});
all_data[name] = result;
return result;
} else {return true}
}
“async:false”设置将导致请求同步,并且在收到来自网址的响应之前不会继续。