0

各「各」が ajax 呼び出しを呼び出す .each 関数があります。さらに別の ajax 呼び出しを行う前に、それらがすべて終了するのを待つ必要があります。ここにあるソリューションを使用しています。クレイジーなことは、end 関数で Ajax 呼び出しの URL を変更すると、機能しなくなったことです。この関数は、すべての 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();
}

最後に、すべての getmeta が終了するまで呼び出されるべきではない postmetas 関数:

 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 関数を次のように変更すると、すべてが機能しなくなり、すべての「getmeta」が完了する前に postmetas が呼び出されます。誰でも理由を理解できますか?

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);
    }
});
}
4

1 に答える 1

1

両方の ajax 呼び出しで async: false を試してください

于 2013-01-01T17:56:03.833 に答える