0

在 $(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);
    });

请帮忙?谢谢!

4

2 回答 2

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);
    });
});
于 2012-12-14T13:02:24.360 回答
1

除了 ThiefMaster 的答案中提供的回调之外,另一个选项是使用$.Deferredobjects。使用 deferreds 可以让您控制异步处理(例如 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函数中说。

于 2012-12-14T13:43:45.567 回答