0

以下のコードでは、これを使用してJSONから変数に値を割り当て、これvar tag = data[j]['text'];を使用して出力しますconsole.log(tag);(テスト用)。

で値を配列にプッシュしようとしましたtags.push(tag);が、機能しません!

これらの値が配列に入らないのはなぜですか?tagの内容を配列に入れようとしています...

function GetAvailableTags() {
            var url = '/TextCodes/TextCodes?key=';
            var tagGroups = [];
            $('.ui-autocomplete-input').each(function () {
                var key = $(this).attr('id');
                var tags = [];
                //console.log(key);
                $.getJSON(url + key, function (data) {
                    for (var j = 0, len = data.length; j < len; j++) {
                        var tag = data[j]['text'];
                        console.log(tag);
                        tags.push(tag);
                    }
                });
                console.log(tags.length);
                for (var k = 0, len = tags.length; k < len; k++) {
                    console.log(tags[k]);
                }
            });
        }

ご協力いただきありがとうございます。

4

2 に答える 2

2

$.getJSON非同期関数だからです。それはあなたのコードが

console.log(tags.length);
for (var k = 0, len = tags.length; k < len; k++) {
    console.log(tags[k]);
}

$.getJSONコールバック関数の前に実行されます:

function () {
    var key = $(this).attr('id');
    var tags = [];
    //console.log(key);
    $.getJSON(url + key, function (data) {
        for (var j = 0, len = data.length; j < len; j++) {
            var tag = data[j]['text'];
            console.log(tag);
            tags.push(tag);
        }
    }

上記のコードを調べると変数が空に見えるのはそのためですがconsole.log(tag);、コールバック関数でデータが出力される可能性はあります。

アップデート

これは、$。getJSONの代わりに$ .ajaxメソッドを使用して、パラメーターを使用してデータを同期的に取得する必要があることを指定する例です。asynch : false

このように、サーバー呼び出し応答(成功コールバック)は、プロセスを続行するために必須です。この非標準的な方法の欠点は、サーバーの応答を待ってWebページがフリーズする可能性があることです。それを行うのに最適なエレガントな方法ではありませんが、便利な場合もあります。

function GetAvailableTags() {
    var url = '/TextCodes/TextCodes?key=';
    var tagGroups = [];
    $('.ui-autocomplete-input').each(function () {
        var key = $(this).attr('id');
        var tags = [];
        //console.log(key);
        $.ajax({
            url: url + key,
            type: 'POST',
            asynch: false,//specify to stop JS execution waiting the server response
            success: function (data) {
                for (var j = 0, len = data.length; j < len; j++) {
                    var tag = data[j]['text'];
                    console.log(tag);
                    tags.push(tag);
                }
            },
            error : function(jqXHR, textStatus, errorThrown) {
                alert('an error occurred!');
            }
        });
        console.log(tags.length);
        for (var k = 0, len = tags.length; k < len; k++) {
            console.log(tags[k]);
        }
    });
}
于 2013-03-17T16:44:23.267 に答える
0

私の解決策は長くてばかげていますが、うまくいきます。これで、配列のように変数にアクセスできますtextCodes['taxes']。sdespontのasyncメモも役に立ちました。

    var textCodes = GenerateTextCodes();
    console.log(textCodes);

    function GenerateTextCodes() {
        var arr = [];
        $('.ui-autocomplete-input').each(function () {
            var id = $(this).attr('id');
            arr[id] = GetAvailableTags(id);
        });
        //console.log(arr['taxes']);
        return arr;
    }

    // get all autocomplete element IDs and put them into an array
    function GetAvailableTags(key) {
        var url = '/TextCodes/TextCodes?key=';
        var tags = [];
        $.ajax({
            url: url + key,
            type: 'GET',
            async: false,
            success: function (data) {
                //console.log(data[0].text);
                //console.log(data.length);
                for (var i = 0; i < data.length; i++) {
                    //console.log(data[i].text);
                    tags.push(data[i].text);
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert('an error occurred!');
            }
        });
        //console.log(tags);
        return tags;
    }
于 2013-03-17T22:23:02.803 に答える