2013-06-20 66 views
1

根据实体的类型,我需要对freebase执行n个查询。Freebase:For循环中的异步调用

例如,如果在前面查询得到的种类和我做的:

for (var n=0;n<types.length;n++) { 
subquery(types[n]); 
} 

function subquery (typid) { 
query = [{ 
    "schema": { 
     "id": typid, 
     ... etc ... } 
}] 

$.getJSON(service_url + '?callback=?', params, function(response) { 
    '... etc...'; 
} 
} 

但第一$.getJSON响应之前,执行第二个for循环。我无法想象解决方案,虽然我读了很多关于异步调用的信息。

回答

1
for (var n=0;n<types.length;n++) { 
    subquery(types[n]); 
} 

上述代码将调用子查询,并且每个子查询调用将立即完成,因为$ .getJSON函数不会中断工作流。

在上述代码执行完毕后,ajax请求的types.length时间几乎在同一时间开始,并且总是会有竞争条件。

一种方法是使用jquery延迟对象,它完全解决您描述的情况,更多阅读Using Deferreds in jQuery 1.5