その理由は、getJSON
呼び出しが非同期であるため、返される前にデータを探しているためです。代わりに、直接または間接的に、コールバック内のデータを使用してコードを配置します。
たとえばloadData
、コールバックにコールバックを受け入れさせることができます。
var my = {};
(function () {
var self = this;
this.sampleData = { };
this.loadData = function(callback) {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
self.sampleData = data;
callback(); // <==== Call the callback
}
);
};
}).apply(my);
my.loadData(function() { // <=== Pass in a callback
console.log(my.sampleData); // Now the data is htere
});
補足:オブジェクトはシングルトンであるため、無名関数は定義されているコンテキストのクロージャであるため、、、、またはmy
の必要なしに、そのコードをかなり単純化できます。apply
this
self
my
var my = {};
(function () {
my.sampleData = { };
my.loadData = function(callback) {
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?',
{tags: "cat", tagmode: "any", format: "json"},
function(data){
my.sampleData = data;
callback();
}
);
};
})();
my.loadData(function() {
console.log(my.sampleData); // Now the data is htere
});
もちろん、代わりにコンストラクター関数などを使用している場合(引用符で囲まれたコードには含まれていませんでしたが、...)、もちろん、より複雑な構造が必要になる場合があります。