1

私はJavaScriptで次のメソッドを持っています:

function getData(){
    var result;

    $.getJSON("app/data/ptl", function (data) {
        if (data == null) {
            return false;
        }

        var x_data = new Array();
        var y_data = new Array();

        $.each(data, function(index, value) {
            x_data.push(index);
            y_data.push(value);
        });

        result = [months_data,value_data];

    });

    alert('');
    return result;
}

このメソッドが呼び出されると、正確なデータが取得されます。ただしalert('')、データを削除しても受信されません。そのような問題の合理的な説明を知っている人はいますか?

4

3 に答える 3

6

これは、関数が非同期であり、を削除するとalertreturn r遠いサーバーが応答する前に行が実行されるためです。

非同期作業を呼び出す関数から単純に同期的に戻ることはできません。通常の解決策は、コールバックを提供し、コールバックでやりたいことを実行することです:

function fetchData(doWithData){
  $.getJSON("app/data/ptl", function (data) {
    if (data == null) {
        return;
    }
    var x_data = new Array();
    var y_data = new Array();
    $.each(data, function(index, value) {
        x_data.push(index);
        y_data.push(value);
    });
    r = [months_data,value_data];
    doWithData(r);
   });
}


fetchData(function(result) {
   // use result here
});
于 2013-03-06T15:34:07.043 に答える
4

あなたalert()return r;あなたの ajax 呼び出しの「成功」ハンドラーの外側にあります。AJAX 呼び出しは非同期であることを忘れないでください。アラートは、ブラウザーがアラートを確認するまで待機するように強制します。これにより、(通常) AJAX 呼び出しが完了し、変数にデータが入力されますr。アラートがなければ.getJSON()、 BEFORErが移入されるとすぐに戻ります。

于 2013-03-06T15:34:34.247 に答える
1

この呼び出しは、非同期プロセス$.getJSON()をセットアップします。関数自体はすぐに (ほぼ) 戻りますが、渡されたコールバック関数は、接続しているサーバーからブラウザーが実際に応答を受信したときに実行されます。したがって、そのようなコールバックから値を返すことは本質的に意味がありません。

代わりに、コールバック関数で取得した情報にアクセスする必要がある作業を行う必要があります。

于 2013-03-06T15:34:50.237 に答える