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 Photo2this 时并没有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 回答