3

次のようなJSON配列を作成したいと思います。

var ddBasic = [
    { text: "Facebook", value: 1, },
    { text: "Twitter", value: 2, },
    { text: "LinkedIn", value: 3, },
    { text: "Foursquare", value: 4, }
];

last.fmのデータを使用しているので、次のようになります。

var tags = [
        { text: "rock", value: "rock", },
        { text: "pop", value: "pop", },
    ];

ddslickドロップダウン関数がimageSrcやドロップダウンに使用できるその他のものを無視するように、最後にコンマを付ける必要があります。それ以外の場合は、次のエラーがスローされます。

Uncaught TypeError: Cannot read property 'imageSrc' of undefined

すべてを結び付けるために、私は持っています:

$('#tag').ddslick({
    data: tags,
    onSelected: function(selectedData) {}   
});

これは、タグを取得する関数です。

var tags = [];

var getTopTracks = function () {
    $.getJSON(
    settings.PHP_REQUEST_URL, {
        method: "tag.getTopTags",
        api_key: settings.LASTFM_APIKEY,
        format: "json",
    },

    function (data) {
        var limit = 50;

        data.toptags.tag.sort(function (t1, t2) {
            return t2.count - t1.count;
        });

        $.each(data.toptags.tag, function (i, item) {
            if (i > limit) return false;
            console.log(item.name);
            tags.push({
                text: item.name,
                value: item.name
            });
        });
    });
};

// event handlers (load quando o form é invocado só)
getTopTracks();
alert(tags.length);

// define tema para a combobox   
$('#tag').ddslick({
    data: tags,
    onSelected: function (selectedData) {}
});

どうすればこれを達成できますか?

4

1 に答える 1

2
var tags = []; //initialised tags with length 0
getTopTracks(); //fetching date in background (!)
alert(tags.length); //running while data is still fitched (unless you've a 0ping connection => alerting length 0

アラートを使用する時点では、非同期tagsリクエストのように満たされていない可能性が非常に高くなります。つまり、リクエストはバックグラウンドで処理され、スクリプトの実行が続行されます。配列を埋めるために既に行ったように、コールバック メソッドを使用する必要があります。$.getJSON()

This, getJSON, is a shorthand Ajax function, which is equivalent to:
$.ajax({   
   url: url,
   dataType: 'json',
   data: data,
   success: callback
});

http://api.jquery.com/jQuery.getJSON/

//getJSON success callback:
function (data) {
    var limit = 50;

    data.toptags.tag.sort(function (t1, t2) {
        return t2.count - t1.count;
    });

    $.each(data.toptags.tag, function (i, item) {
        if (i > limit) return false;
        console.log(item.name);
        tags.push({
            text: item.name,
            value: item.name
        });
    });
    //alert the length AFTER the tags been pushed
    alert(tags.length);

    // define tema para a combobox   
    $('#tag').ddslick({
        data: tags,
        onSelected: function (selectedData) {}
    });
}
于 2012-10-13T17:22:31.893 に答える