2

私は JavaScript の初心者です。初期化時にAjaxでFlickr Web APIと通信するクラスを作りたいです。

Photo2.js

  var Photo2;

  Photo2 = (function() {

    Photo2.prototype.json = null;

    function Photo2() {
      $.getJSON('http://www.flickr.com/services/rest/?jsoncallback=?', {
        format: 'json',
        method: 'flickr.photos.search',
        api_key: '7965a8bc5a2a88908e8321f3f56c80ea',
        user_id: '29242822@N00',
        per_page: '100'
      }, function(data) {
        this.json = data.photos.photo;
      });
    }

    return Photo2;

  })();

しかし、photo2 = new Photo2これにはphoto2.json.

ご親切にありがとうございました。

4

1 に答える 1

2

コードを本当に書き直す必要があります。何を達成したいのかを理解するのは複雑で困難です。

まず、サーバーからのデータの取得は非同期であるため、 Photo2jsonプロパティのインスタンスを作成した後に定義されるかどうかはわかりません。

次に、オブジェクトの初期化中にサーバー呼び出しを行うのは非常に悪い考えです。次の解決策をお勧めします。

(function() {
  var Photo2 = function(callback) {
    this.json = null;
  };

  Photo2.prototype.getData =  function(successCallback) {
    var self = this;

    $.getJSON('http://www.flickr.com/services/rest/?jsoncallback=?', {
        format: 'json',
        method: 'flickr.photos.search',
        api_key: '7965a8bc5a2a88908e8321f3f56c80ea',
        user_id: '29242822@N00',
        per_page: '100'
      }, function(data) {
        self.json = data.photos.photo;
        typeof successCallback == 'function' && successCallback();
      }); 
  };

  var photo = new Photo2();
  photo.getData(function successCallback() {
    console.log('Data loaded', photo.json);
  });
}).call(this);

ここでの動作デモ: http://jsbin.com/ureyas/1/edit

于 2012-11-13T10:27:54.450 に答える