2013-01-01 156 views
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); 
    } 
}); 
} 

回答

1

嘗試異步:在這兩個AJAX誤報

+0

你是怎麼通過 「兩」 是什麼意思?在getmetas中使用async:false不是一個選項,因爲它們中有很多,瀏覽器可能會完全鎖定。在第二個postmetas中使用它不會真的有幫助,因爲我試圖阻止postmetas被稱爲尚未! – Phil

+0

爲什麼你在第二個postmetas函數中沒有使用type:「POST」。 –

+0

這是一個疏忽,但我加了它,它沒有什麼區別。 – Phil

相關問題