2011-02-03 10 views
2

別のページのPHPファイルからオブジェクトを取得しようとしています。私は正しく動作しているjsonグラブを行うには、jQueryのajax関数を使用しています。問題は、そのオブジェクトを関数から返そうとするときです。Javascript - ネストした関数からアクセスできないローカルスコープオブジェクト

初めて(成功関数内から)オブジェクトをログに記録すると、コンソールでは正しくなりますが、関数getGantt()から返されたオブジェクトは「未定義」としてログに記録されます。

このオブジェクトを関数から取り除くにはどうすればよいですか?

マイコード:

function getGantt(requestNumber){ 
     var ganttObject; 
     $.ajax({ 
       type: "POST", 
       url: "get_gantt.php", 
       data: {request_number: requestNumber}, 
       success: function(returnValue){ 
        ganttObject = $.parseJSON(returnValue); 
        console.log(ganttObject); //this logs a correct object in the console 

       } 
     }); 
     return ganttObject; 
    } 

    $(function(){ //document ready function 

     var requestNumber = $('#request_number').text(); 

     var ganttObject = getGantt(requestNumber); 
     console.log(ganttObject); //this logs "undefined" 

    }); //end document ready function 
+3

あなたがいます。 ajaxコールバックがganttObjectを設定する前に変数を返します。 – kjy112

+0

AJAXは非同期で実行されます。戻り値が発生した後のAJAXプロセスが完了するまで、getGantt関数は値を取得しません。 (a)成功関数で 'returnValue'を使用するようにプログラミングを再構成する必要があります(b)後でアクセス可能なグローバル/オブジェクト変数にreturnValueを格納します(トリガー/待機プロセスに関する問題を引き起こします) – Rudu

+0

; stackoverflowは非常に高速です。 10分以内に3つの良い答え! –

答えて

7

アヤックスでAは頭字語の重要な部分です。非同期JavaScriptとXMLは非同期です。

$.ajax({success:someFunction})手段はHTTPリクエストを作成し、応答が到着したときに、応答が到着someFunction

return ganttObjectランを実行します。

someFunction内のデータで何かしたいことを行い、データを呼び出し元の関数に返そうとしないでください。

+1

LOLはAjaxのAが頭字語の重要な部分であることを愛しています...その次回を使うつもりです。 – kjy112

+0

Xは重要ではないと付け加えるべきです; – Quentin

+0

ありがとうございました。私は、通常の流れから取り除かれたajaxについて完全に忘れていました。これは私の質問に完全に答えます。 –

0

私はそれが少なくともそれを戻していない理由を知っています。 ganttObjectは同じスコープ内にある可能性がありますが、成功関数は最終的にXMLHTTPオブジェクトからのreadyStateコールバックで実行されているため、getGantt関数とは異なるスレッド上にあります。

1

AJAXのAは非同期のため、すぐに呼び出しが戻り、処理が終了すると成功のコールバックが呼び出されます。

だから、単にコールバックを使用するようにコードを変更します。

function getGantt(requestNumber, callback) { 
    var ganttObject; 
    $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: "get_gantt.php", 
     data: {request_number: requestNumber}, 
     success: function(returnValue){ 
      callback(returnValue); 
     } 
    }); 
} 

$(function() { 

    var requestNumber = $('#request_number').text(); 

    var ganttObject = getGantt(requestNumber, function(ganttObject) { 
     console.log(ganttObject); 
    }); 

}); 

はところで、私はまた、このparseJSONのものを削除しました - JSONにデータ型を設定すると仕事をしていませんし、あまり汚れている

+0

ヒントをいただきありがとうございました。 –

関連する問題