2010-07-28 78 views
1

我遇到条件符合条件之前执行的if语句中的行有问题。我想要做的是:Javascript/jQuery操作顺序

  1. 检查是否已加载数据(大的旧数组数组)。
  2. 如果没有得到它并将其加载到我的all_data对象中。
  3. 情节数据(或在这种情况下,提醒它)

下面的代码(剥离的很多细节是可读的

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

通行证需要发生数据是否被加载的回调函数,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(); } 
} 
0

正如其他人所说,这个问题是,$获得()函数是异步的,其立即返回。您可以使用下面的方式创建同步请求,并执行预期的操作。

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} 

}

的“异步:假”设置将导致请求是同步的,并且不会继续,直到接收到从URL的响应。