1

私はデータベースからこのデータディクショナリを取得しています:

{"first":{"Head1":"6643Z","Head2":"1245Z"},"second":{"Head1":"1109E","Head2":"1231A"}}

「Head1」レコードの最初の値のみを取得する必要があります。このため、getJSONメソッドから値を取得するためにグローバル変数を追加しましたが、最初に未定義の値で2番目のアラートを実行し、次に最初のアラートを実行します。適切な値で...

 var message;
 jQuery.getJSON("get_data.json", function(msg){
    jQuery.each(msg,function (key,val){
        message=val['string_data'];
        return false;//trying to break
     });
    alert("first"+message); 
  });

alert("second"+message);

これを行うには、2番目のアラートに正しい値を強制する方法、つまり、コードを正しい順序で実行するように強制する方法を教えてください。

4

1 に答える 1

4

2番目のアラートが表示される理由はundefined、そのコードが実行されたときに、リクエストがまだ完了していないためです。

同期作成して、リクエストが完了するまでアラートが実行されないようにすることができますが、ユーザーエクスペリエンスが低下し(ブラウザーがロックされ)、jQueryは今後のバージョンでアラートのサポートを終了します。ドキュメントを見ると、それがを呼び出す単なるラッパーであることがわかります。使用する場合は、オプションを指定できます。(これは、JSONでajaxを使用しているためです。JSON-Pの場合、JSON-Pは非同期プロトコルであるため、同期オプションはありません。)getJSON getJSONajaxajaxasync: false

はるかに優れたオプションは、Web通信の非同期性を採用することです。このデータを使用する必要があるものは何でも、コールバックを提供するようにします。

function getTheData(callback) {
    jQuery.getJSON("get_data.json", function(msg){
        var message, key;

        for (key in msg) {
            message = msg[key];
            break; // <== SEE BELOW
        }
        callback(message);
    });
}


getTheData(function(message) {
    alert("second"+message);
});

また、取得するオブジェクトには順序がないため、そのオブジェクトから「最初の」値を取得するコードは信頼できないことに注意してください。そのプロパティの値を確実に取得するには、探しているプロパティキーを知っている必要があります。JSONのテキストに表示される順序は、結果のオブジェクトのプロパティの順序には影響しません。(もちろん、配列は異なります。)

したがって、たとえば、の値が常に必要な場合は、次のようにしますfirst

function getTheData(callback) {
    jQuery.getJSON("get_data.json", function(msg){
        callback(msg.first);
    });
}
于 2012-12-07T18:49:36.630 に答える