1

外部 JSON ファイルから読み込まれたデータを持つグローバル スコープのオブジェクトを作成したいと考えています。ドキュメントがロードされたら、このオブジェクトのデータを使用したいと考えています。つまり、ユーザー入力を待ちません。jqueryの異なる方法を使用しようとしています。Jquery get メソッドは、後で使用する適切な異なるオブジェクトを生成すると仮定します。オブジェクトを宣言するためのコードは次のとおりです

var myData = {
init: function () {
    $.getJSON('data/data.json', function (raw) {    
        myData.data = raw; 
        alert(myData.data['UWLO']['name']);
        yes = true;
        $.each(raw, function (code, details) {
            if (yes){
                alert(code);
            }
            yes = false;
            nameList[details.name] = code;
        });
        //alert(nameList);
    });
},
data: {},
nameList: {},
findByCode: function (code) {
    return myData.data[code];
},
getCode: function (name) {
    return nameList[name];
},
getNameStrings: function () {
    return Object.keys(nameList);
}
} 

オブジェクトを初期化するように見えるコードは次のとおりです。

$(document).ready(function () {
    $.when(myData.init()).then(function () {
        alert(myData.nameList);
    });
});

アラート(myData.data['UWLO']['name']); request は正しい値を提供するため、json ファイルが正しくロードされ、正しい形式でアラート (コード); 行が機能するので、スクリプトは正しくループに入ります 問題は nameList の生成にあると思います

4

1 に答える 1

3

あなたは近くにいます。$.ajax関数はdeferredオブジェクトの promise を返します。initしたがって、後で使用できるようにするには、関数からそれを返す必要があります。これを試して:

init: function () {
    return $.getJSON('data/data.json', function (raw) {  

他のスニペットを単純化することもできます:

myData.init().done(function() {
    //...
});

編集 - 実際には、コールバックが発生する順序を明確にするために (実際のソリューションではこれがより複雑な場合)、次のような独自の遅延オブジェクトを作成する方がよい場合があります。

init: function () {
    var def = $.Deferred();
    $.getJSON('data/data.json', function (raw) {    
        myData.data = raw; 
        alert(myData.data['UWLO']['name']);
        yes = true;
        $.each(raw, function (code, details) {
            if (yes){
                alert(code);
            }
            yes = false;
            nameList[details.name] = code;                
        });
        //alert(nameList);
        def.resolve();
    });
    return def.promise();
},
于 2013-09-12T13:23:04.340 に答える