Javascript/jQuery操作顺序
在满足条件之前执行if语句时,if语句中的一行出现问题。我想做的是:Javascript/jQuery操作顺序,javascript,jquery,Javascript,Jquery,在满足条件之前执行if语句时,if语句中的一行出现问题。我想做的是: 检查数据(旧的大数字数组)是否已加载 如果没有,则获取它并将其加载到我的all_数据对象中 打印数据(或在这种情况下向其发出警报) 下面是代码(去掉了许多细节以便阅读 var all_data={}; function get_data(name,rid) { if (!all_data[name]) { return $.get('/data.json',
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时,它会立即警告“undefined”,因为jQuery.get正在返回一个(尚未完成的)请求对象。此时,条目all_data[name]未定义。如果我等待5秒,get请求完成,再次运行代码只会警告“[object object]”因为数据已经加载了。我意识到我可以在$.get回调和else语句中都放一个函数,但这将使它不再通用。有什么想法吗
Chris将无论数据是否作为回调函数加载都需要发生的事情传递到
load\u 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(); }
}
正如其他人所说,问题在于$.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”设置将导致请求是同步的,并且在收到url的响应之前不会继续