2

サーバースクリプトからjsonとしてフェッチされた値をグローバル配列に入力するjsに関数があります。

function populateValues(id) {
    var values=new Array();

    $.getJSON(
        '<?PHP echo base_url();?>admin/forums/getForumById/' + id ,
        function(data){
            $.each(data,function(k,v){
                values.push(v);
            });
            alert(values[1]);
        }
    );
}

これは正常に機能し、目的の値を警告します。しかし、ループ後にこれを警告しようとすると、値が失われ、未定義になります。これがケースです:

function populateValues(id) {
    var values=new Array();

    $.getJSON(
        '<?PHP echo base_url();?>admin/forums/getForumById/' + id ,
        function(data){
            $.each(data,function(k,v){
                values.push(v);
            });
        }
    );
    alert(values[1]);
}

それはいくつかの閉鎖構造の形成によるものですか?それとも、私が欠けている基本的な概念ですか?配列をグローバルとして宣言した場合でも、値が警告されない理由を知りたいだけです。光を当ててください。

4

2 に答える 2

16

問題はスコープではありません。

問題は、AJAX 呼び出しを行ってから、AJAX 呼び出しが完了する前にすぐに次のステートメントに進むことです。

したがって、alert(values[1]);配列が AJAX 呼び出しから埋められる前に。

于 2012-12-28T15:38:16.833 に答える
3

これにより、AJAX呼び出しによって返されるPromiseオブジェクトを使用して修正されます。

function populateValues(id)
{
    var values=new Array();

    $.getJSON('<?PHP echo base_url();?>admin/forums/getForumById/'+id,function(data){
        $.each(data,function(k,v) {
            values.push(v);
        });
    }).done(function() { alert(values[1]); });
}    
于 2012-12-28T15:42:18.410 に答える