0

jQuery関数$.getJSONを使用してサーバー側からデータを取得しています。コードは次のとおりです。

function (){
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
  });

  // this prints the data as undefined
  alert(result.msg); 
}

グローバルにするために返される「結果」の範囲を変更する方法$.getJSON.. 2番目のアラートを作成して、その値を未定義にしないようにしますか??

4

4 に答える 4

4

できません。AJAX は非同期であるため、コールバックresult内でのみ変数にアクセスできます。successグローバルにすることもできますが、呼び出しの直後の行は、コールバックが実行されて役に立たなくなるずっと前$.getJSONに呼び出されることに注意してください。success

したがって、グローバル変数はありません。コールバック内で AJAX 呼び出しの結果を消費します。

function () {
    $.getJSON('someURI', function(result){
        // only here you can hope to consume the results of an AJAX call
        alert(result.msg) 
    });
}

それがAJAXの仕組みです。AJAX の A は非同期を表します。

于 2012-08-18T16:16:29.333 に答える
3

これは非同期呼び出しです。したがって、サーバーが応答するまで待つ必要があります...あなたの場合、サーバーがまだ応答していないため、外側のアラートは未定義になります...また、のスコープresultはに制限されてcallback functionおり、アクセスできません...

ただし、次のようにすることができます。

var myJSON;
var serverResponded = 0;

function () {
    $.getJSON("someURI", function (result) {
        //this alert works fine
        myJSON = result.msg;
        serverResponded = 1;
    });
    setTimeout(function () {
        if (serverResponded) {
            alert(myJSON);
        }
    }, 500);
}
于 2012-08-18T16:19:20.943 に答える
1

この$.getJSON呼び出しは Ajax 呼び出しへのショートカットであり、「Ajax」は「<strong>Asynchronous JavaScript and XML」の略です。

追加して、成功関数でvar globalResult実行するとします。そのため、コールバックの外側globalResult = result;を呼び出すと、まだ割り当てられません。なので、どうしても外で処理しなければならない場合は、 という関数が割り当てられているかどうかを確認できますが、これでは行き過ぎです。globalResultglobalResultsetInterval

于 2012-08-18T16:21:01.857 に答える
0

このような別の変数に保存します

function (){
var something;
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
    something = result
  });

関数ラッパーの外側にスコープを設定したい場合は、次のようにします

var something;
function (){
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
    something = result
  });
于 2012-08-18T16:19:20.563 に答える