0

私はこのようなxmlファイルを持っています

<users>
    <user>
        <name>LOREM</name>
        <pic>LOREM</pic>
        <post>www.URL.com/info.json</post>
    </user>
    <user>
        <name>LOREM</name>
        <pic>LOREM</pic>
        <post>www.URL.com/info.json</post>
    </user>
</users>

私はこのxmlをjqueryで解析します:

var data = {};
$.get('xmlfile.xml', function(xml){
    var oXML = $(xml);

    oxml.find('user').each(function(i){
        data[i].name = $(this).attr('name');
        data[i].pic = $(this).attr('pic');
        data[i].post = /* i must load a json file with all posts here*/
    });

});

投稿はextern jsonファイルにあります。私はこのようにロードxmlでjsonをロードしようとしました

var data = {};
$.get('xmlfile.xml', function(xml){
    var oXML = $(xml);

    oxml.find('user').each(function(i){
        data[i].name = $(this).attr('name');
        data[i].pic = $(this).attr('pic');
        data[i].post = $.getJSON($(this).attr('post'), function(data){
            retrun data;
        });
    });

});

しかし、それはうまくいきません。の値data[i].postはヌルです。load xml で json をロードするアイデアはありますか?

4

2 に答える 2

2

$.getJSONAJAX は非同期であるため、非同期です。コールバック内でのみ AJAX 呼び出しの結果にアクセスできsuccessます。あなたの例では、$.getJSON呼び出しの戻り値をdata[i].post変数に割り当てようとしています。しかし、AJAX 呼び出しが成功した後でのみ値が使用可能になる可能性があるため、これは機能しない可能性があります。

したがって、ロジックを少し逆にすることができます。

$.get('xmlfile.xml', function(xml) {
    var oXML = $(xml);

    oxml.find('user').each(function(i) {
        var index = i;
        $.getJSON($(this).attr('post'), function(res) {
            data[index].name = $(this).attr('name');
            data[index].pic = $(this).attr('pic');
            data[index].post = res;
        });
    });
});
于 2013-01-22T17:03:20.153 に答える
1

主な問題は、getJSON非同期であることです

あなたのpostプロパティは、ここで間違ってdataいるnullことが2つあるためです。

  1. getJSON非同期なので、.eachすでに実行された後にデータを取得します
  2. getJSONデータではなくjqXHRオブジェクトを返す

このように変更してみてください:

var data = []; // you likely want an array and not an object
var counter = 0;

$.get('xmlfile.xml', function(xml) {

    var oXML = $(xml);

    oxml.find('user').each(function(i) {
        var me = $(this);

        data.push({
            name: me.attr('name'),
            pic: me.attr('pic'),
            post: null
        });

        // increment counter
        counter++;

        $.getJSON(me.attr('post'), (function(index) {
            return function(data) {
                data[index].post = data;
                if (!--counter) // when it reaches ZERO
                {
                   setTimeout(function() {
                       // all JSONs have loaded now continue with your stuff
                   }, 0);
                }
            };
        })(i));
    });

});

上記のコードは、すべての JOSN オブジェクトがロードされたことも検出するため、処理を続行できます。

しかし、それとは別に、次のように機能します。

  1. XMLを取得します
  2. XML を受信すると、user要素を繰り返し処理し、オブジェクトを準備dataして配列にプッシュします。
  3. オブジェクトごとに Ajax 呼び出しを発行して、JSON データも取得します。
  4. JSON への呼び出しが成功するたびに、正しいdataオブジェクトのpostプロパティが入力され、減少しますcounter
  5. counter がゼロに達すると、追加の関数がキューに入れられ、すべてがロードされて完了した後に実行する必要があるコードを配置できます。

JSON リクエストも失敗する可能性がある場合は、$.ajax代わりにを使用することをお勧めします。それ以外の場合、成功のみがカウントされている場合、ゼロにはなりません。getJSONerrorcounter

于 2013-01-22T17:05:44.477 に答える