Javascript / jQuery操作顺序

时间:2010-07-28 19:29:34

标签: javascript jquery

我在遇到条件之前执行的if语句中遇到问题。我想做的是:

  1. 检查是否已加载数据(大数字旧数组)。
  2. 如果没有,请将其加载到我的all_data对象中。
  3. 绘制数据(或在此情况下提醒)
  4. 这是代码(删除了许多可读的细节

    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语句中添加一个函数,但这会使它不再泛化。有什么想法吗?

    克里斯

2 个答案:

答案 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”设置将导致请求同步,并且在收到来自网址的响应之前不会继续。