如何从回调函数访问对象?

时间:2012-06-19 21:16:41

标签: javascript asynchronous google-feed-api

我感觉很糟糕,因为很可能已经回答了这个问题,我只是没有使用正确的搜索字词。我是异步JavaScript的新手。所以,我将带领道歉。如果有人甚至可以帮助我获得正确的搜索条件,我将非常感激。

我正在尝试使用Google Feed API。当我按照hello world部分中列出的库存示例时,我可以使用它。我正在尝试制作一些更具可扩展性的东西,以便我可以在几个地方使用它。所以我创建了一个对象......

function AlertRSS(num, url, div, date) {
  this.num = typeof num !== 'undefined' ? num : 5;
  this.url = typeof url !== 'undefined' ? url : 'http://arstechnica.com/author/caseyjohnston/feed/';
  this.sel = typeof sel !== 'undefined' ? sel : '#alert';
  this.date = typeof date !== 'undefined' ? date : this.getYesterday();
}

然后我尝试调用方法内的对象...

AlertRSS.prototype.displayFeed = function() {
  var retval = null;
  var feed = new google.feeds.Feed(this.url);
  feed.load(function(result) {
  var tmp = this;
    if (!result.error) {
      for ( var i = 0; i < result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        console.log(sel + ' <h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br  />');
        $(tmp.sel).append('<h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br  />');
      }
    }
  });
};

但是,似乎我无法从对象访问属性。我一直在控制台中获得Uncaught ReferenceError: sel is not defined

我认为这个问题与范围有关,但在这一点上我觉得有点偏离我的深度。任何帮助都将非常感激。

更新

对于第一篇文章,这是一个讽刺。我的代码中有很多错误。两个回答都是正确的。但是,如果像我这样的另一个可怜的新手看到这个问题,我想把工作代码放在那里。

问题原来是放置var tmp = this;行。它需要放在内部回调函数之外才能工作。根据Tomasz Nurkiewicz的建议,我还将var tmp更改为var that。工作代码如下:

function AlertRSS(num, url, sel, date) {
  this.num = typeof num !== 'undefined' ? num : 5;
  this.url = typeof url !== 'undefined' ? url : 'http://arstechnica.com/author/caseyjohnston/feed/';
  this.sel = typeof sel !== 'undefined' ? sel : '#alert';
  this.date = typeof date !== 'undefined' ? date : this.getYesterday();
}

AlertRSS.prototype.displayFeed = function() {
  var feed = new google.feeds.Feed(this.url);
  var that = this;
  feed.load(function(result) {
    if (!result.error) {
      for ( var i = 0; i < result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        console.log(that.sel + ' <h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br  />');
        $(that.sel).append('<h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br  />');
      }
    }
  });
};

2 个答案:

答案 0 :(得分:1)

您正在创建tmp变量以捕获this(请注意,在此上下文中通常称为that)。您甚至可以在此处正确使用此引用:tmp.sel。但是你忘了在那之前使用它:

console.log(sel + ' <h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br  />');

更改为:

console.log(tmp.sel + //...

你会没事的。

答案 1 :(得分:1)

你的函数params要求div而不是sel。