Javascript/jQuery操作顺序

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',

在满足条件之前执行if语句时,if语句中的一行出现问题。我想做的是:

  • 检查数据(旧的大数字数组)是否已加载
  • 如果没有,则获取它并将其加载到我的all_数据对象中
  • 打印数据(或在这种情况下向其发出警报)
  • 下面是代码(去掉了许多细节以便阅读

    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的响应之前不会继续