JQuery,AJAX:如何使用json返回填充数组?

时间:2010-12-30 20:31:04

标签: javascript jquery ajax arrays

我正在尝试关注代码,但只在警告框中显示“未定义”。任何人都知道如何在.ajax之外实际填充数组?

$(document).ready(function() {

    var reviewArray = new Array();

    getReviews();

    alert(reviewArray[0]);

});

function getReviews()
{

   $.ajax({
    type : 'GET',
    url  : 'reviewbox.php',
    dataType : 'json',
    success  : function ( data ) {

    $.each( data.reviews, function( i, itemData ) {
       reviewArray[i] = itemData.review;
    });
    },
    error    : function ( XMLHttpRequest, textStatus, errorThrown) {
        var err = "An error has occured: " + errorThrown;
        $("body").append(err);
        }
    });

}

2 个答案:

答案 0 :(得分:7)

你有两个问题:

  1. Ajax调用是异步的。执行alert时,数组尚未填充(Ajax调用尚未返回)。
  2. 数组reviewArray不在getReviews的任何(父)范围内(即无法从该函数访问)。
  3. alert放入回调:

    $(document).ready(function() {  
        getReviews(function(reviewArray) {
             alert(reviewArray[0]);
        }); 
    });
    
    function getReviews(callback) {
        $.ajax({
            /*...*/
            success  : function (data) {
                var reviewArray = [];
                $.each( data.reviews, function( i, itemData ) {
                   reviewArray[i] = itemData.review;
                });
                callback(reviewArray);
            },
            /*...*/
       });
    }
    

    如果您希望事先声明reviewArray,则还必须在getReviews回调中定义ready

    $(document).ready(function() {  
        var reviewArray = [];
    
        getReviews(function() {
             alert(reviewArray[0]);
        });
    
        function getReviews(callback) {
            $.ajax({
                /*...*/
                success  : function (data) {
                    $.each( data.reviews, function( i, itemData ) {
                       reviewArray[i] = itemData.review;
                    });
                    callback();
                },
                /*...*/
           });
        }
    }); 
    

    但是这样,应用程序的实际流程可能会更加混乱。

答案 1 :(得分:1)

试试这个:

$(document).ready(function() {

    getReviews();

});

function getReviews()
{

    var reviewArray = new Array();

   $.ajax({
    type : 'GET',
    url  : 'reviewbox.php',
    dataType : 'json',
    success  : function ( data ) {

    $.each( data.reviews, function( i, itemData ) {
       reviewArray[i] = itemData.review;
    });
    alert(reviewArray[0]);
    },
    error    : function ( XMLHttpRequest, textStatus, errorThrown) {
        var err = "An error has occured: " + errorThrown;
        $("body").append(err);
        }
    });

}