0

$(document).ready では、配列に追加する json データを返す関数で ajax リクエストを作成しています。その関数から配列を返していますが、返されたものを別の配列に割り当てようとすると、値でいっぱいの配列がアラートに表示されません。

 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の回答で提供されているコールバック以外のオプションは、$.Deferredオブジェクトを使用することです。延期を使用すると、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 
    });
});

また、すでにpromise自体を返しているので、関数$.ajaxで言うことができます。return $.ajax({...});retrieveGroupNames

于 2012-12-14T13:43:45.567 に答える