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);在回调函数中打印数据。

更新

下面是一个使用 $.ajax 方法而不是 $.getJSON 来指定必须使用参数同步检索数据的示例asynch : false

通过这种方式,服务器调用响应(成功回调)是继续该过程所必需的。这种非标准方式的缺点是您的网页可能会在等待服务器响应时被冻结。这不是最好的优雅方式,但有时它很有用。

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 回答