0

私はこのコードを持っています:

var my = {};

(function () { 
    var self = this;
    this.sampleData = { };

    this.loadData = function() {
       $.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?', 
          {tags: "cat", tagmode: "any", format: "json"},
          function(data){
             self.sampleData = data;
          }
       );
    };
}).apply(my);

my.loadData();
console.log(my.sampleData); // {}

問題は、my.sampleDataに何も含まれていないことです。

ここでこのサンプルを試してください:http://jsfiddle.net/r57ML/

4

2 に答える 2

3

その理由は、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の必要なしに、そのコードをかなり単純化できます。applythisselfmy

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
});

もちろん、代わりにコンストラクター関数などを使用している場合(引用符で囲まれたコードには含まれていませんでしたが、...)、もちろん、より複雑な構造が必要になる場合があります。

于 2012-04-18T10:16:52.187 に答える
0
(function () { 
        var self = this;
        this.sampleData = {};

        this.loadData = function() {
           $.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?', 
              {tags: "cat", tagmode: "any", format: "json"},
              function(data){
                 self.sampleData = data;
                 console.log(my.sampleData); // you get sample data after ajax response
              },
           'json');
        };
    }).apply(my);

    my.loadData();
于 2012-04-18T10:17:09.347 に答える