Javascript将函数返回的数组分配给包含所有元素的另一个数组

时间:2012-12-14 13:00:59

标签: javascript jquery

在$(document).ready中我在一个函数中创建ajax请求,它返回我添加到数组的json数据。我从该函数返回数组但是当我尝试将返回的数据返回给另一个数组时,我的警报不会显示一个充满值的数组。

 function retrieveGroupNames() {
        var rows = new Array();
        $.ajax({
            type: "POST",
            url: '@Url.Action("LookUpGroupName", "UserManager")',
            dataType: "json",
            data: {},
            success: function (data) {
                for (var i = 0; i < data.length; i++) {
                    rows[i] = {
                        data: data[i],
                        value: data[i].group,
                        result: data[i].group
                    }
//                    alert(data[i].group);
                    //                    alert(data[1].group);
                } // end of for loop
                //                alert(rows[1].value);


            } // end of success
        });   // end of ajax
//        alert(rows); data here
        return rows;

    } // end of function

$(document).ready(function () {
        chkSelection();
        var rows = [];
        rows = retrieveGroupNames();
        alert(rows);
    });

请帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:3)

AJAX是异步的。您无法返回依赖于完成请求的内容。您需要使用回调:

function retrieveGroupNames(callback) {
    $.ajax({
        type: "POST",
        url: '@Url.Action("LookUpGroupName", "UserManager")',
        dataType: "json",
        data: {},
        success: function(data) {
            var rows = [];
            for(var i = 0; i < data.length; i++) {
                rows[i] = {
                    data: data[i],
                    value: data[i].group,
                    result: data[i].group
                }
            }
            callback(rows);
        }
    });
}

$(document).ready(function() {
    chkSelection();
    retrieveGroupNames(function(rows) {
        alert(rows);
    });
});

答案 1 :(得分:1)

除了ThiefMaster答案中提供的回调之外的其他选项是使用$.Deferred objects。使用延迟可以控制异步处理期间何时以及应该发生什么,例如ajax调用。

function retrieveGroupNames() {
    // create a deferred object
    var deferred = new $.Deferred();

    $.ajax({
        ...
        success: function(data) {
            var rows = [];
            for(var i = 0; i < data.length; i++) {
                rows[i] = {
                    data: data[i],
                    value: data[i].group,
                    result: data[i].group
                }
            }
            // resolve the deferred and pass the rows as data
            deferred.resolve(rows);
        }
    });

    // return a promise
    return deferred.promise();
}

$(document).ready(function () {
    // use the when...then syntax to consume the deferred function
    $.when(retrieveGroupNames()).then(function (rows) {
        // do whatever you want with rows 
    });
});

另请注意,$.ajax已经自行返回了一个承诺,因此您可以在return $.ajax({...});函数中说retrieveGroupNames