0
我有一個.each函數,其中每個「每個」都是ajax調用。我需要等到他們完成之後再繼續進行另一次ajax調用。我正在使用找到的解決方案here。瘋狂的事情是,一旦我在最終功能中更改了Ajax調用的URL,它就停止工作;該函數不會等待所有ajax調用完成。jquery when.apply()。done等待一個ajax調用,但不是另一個?
var iarr=[];
$.getJSON("http://dbpedia.org/sparql?default-graph-uri=blablbla-get several-links", {},
function (data) { //links returned through json
var def = [];
$.each(data.results.bindings, function() {
var tlink = this.link.value;
def.push(getmeta(tlink)); //get the meta values for each link
});
$.when.apply($, def).done(postmetas());
});
的getmeta功能如下:
function getmeta(lnk){
var dfd=$.Deferred();
$.ajax({
url: "meta.php",
type: "POST",
data: {url: lnk},
dataType: "json",
async: true,
success: function (r) {
if (r !==null){
iarr.push({
"title": r.title,
"desc": r.desc,
"url": r.url
});
dfd.resolve();
}
}
});
return dfd.promise();
}
最後,postmetas功能,這不應該叫,直到所有的getmeta的完成:
function postmetas(){
$.ajax({ //
url: "meta.php",
type: "POST",
data: {url: wik},
dataType: "json",
success: function (r) {
iarr.push({
"title": r.title,
"desc": r.desc,
"url": r.url
});
console.log(iarr);
}
});
}
}
這個偉大的工程,並且在所有的ajax調用完成之後,日誌給了我iarr數組中的所有值。
這是事情:當我將postmetas函數更改爲以下內容時,整個事件停止工作,postmetas在所有「getmeta」完成之前被調用。任何人都可以找出原因嗎?
function postmetas() {
$.ajax({
url: "http://dbpedia.org/sparql?default-graph-uri=blabla-some-text",
dataType: "json",
success: function (r) {
var descr = r.results.bindings[0].abstract.value;
var subtitle = descr.substr(0, descr.indexOf('. '));
iarr.push({
"title": wtitle, //wtitle is a variable we established before
"desc": subtitle,
"url": wurl //wurl is a variable we established before
});
console.log(iarr);
}
});
}
你是怎麼通過 「兩」 是什麼意思?在getmetas中使用async:false不是一個選項,因爲它們中有很多,瀏覽器可能會完全鎖定。在第二個postmetas中使用它不會真的有幫助,因爲我試圖阻止postmetas被稱爲尚未! – Phil
爲什麼你在第二個postmetas函數中沒有使用type:「POST」。 –
這是一個疏忽,但我加了它,它沒有什麼區別。 – Phil