0

我正在尝试使用用于 javascript 的 oauth 库来获取推文。我创建了一个对象,该对象接收 twitter 时间线的 url 以获取并将其放入列中。代码是

   lister=function(opts) {
    this.setresource =lister.setresource;
    this.config = lister.config;
    this.config.resource = opts;
    this.putTweet = lister.putTweet;
    this.listerstrap = lister.listerstrap;
    this.addStrip = lister.addStrip;
    this.setTweets = lister.setTweets;
    this.addTweets = lister.addTweets;

}    

现在,如果我创建两个新的 lister 对象,

    var l1 = new lister('user1'); //user1 and user2 refer to url of the timelines 
    l1.listerstrap();
    var l2 = new lister('user2');
    l2.listerstrap();

listerstrap 函数是:

     lister.listerstrap = function () {
   this.addStrip().setresource().addTweets();

   }

问题发生在 addTweets()

     lister.addTweets = function () {

   var _ = this;
   oauth.get(twiapi + _.config.resource, function (res) {
       _.setTweets(JSON.parse(res.text));
       console.log(_.config.resource);  // * 
   });

在 * 处, this (_) 指的是相同的(l2 实例),因此当调用 setTweets 时,来自两个资源的推文被设置到同一列中

这是一个关闭问题吗?

编辑:我正在尝试根据时间线或列表将推文设置为不同的列(如 Tweetdeck 中所做的那样,每个列表都有不同的列)。虽然我从两个网址获得了推文,但它们被设置在同一列中。_ 包含对我在 addStrip() 中创建的每一列的 div 元素的引用。但不知何故 _ 在回调中引用同一个实例。我希望它将推文设置到各自的列中

4

2 回答 2

1

我很确定 指的_是不同的实例。问题是您在执行此操作时覆盖了共享配置对象的属性:

this.config = lister.config;
this.config.resource = opts;

所以,你l1l2总是有相同的config对象。一旦您实例化l2,它就会覆盖该resource属性。

您可能想要创建一个克隆:

this.config = clone(lister.config);

哪里clone可能是您选择的一些实现

于 2013-01-18T09:31:37.010 回答
1

问题不在于addTweets方法,如果您阅读了我之前的回答:忘记它。

问题是这样的:

this.config = lister.config;
this.config.resource = opts;

您的构造函数分配对对象的引用,对象本身不会被复制。因此,通过分配对实例的引用,然后更改被引用的对象,您正在更改所有实例引用的对象。

快速解决方法是更改this.config = lister.config;​​为:

this.config = {foo: 'bar', something: 'else', resource: opts};//each time the constructor is called, create a new object literal

但是,请务必考虑使用原型,因为将引用分配给函数对象的属性,这也可以兼作构造函数,这不是最好的方法。

更新:

回应 OP 的评论:您所看到的非常有意义。您正在创建一个新实例,将单个config.resource对象(只有一个)设置为User1,然后addTweets调用该函数。此函数执行异步请求。异步是经常被忽视的东西,但在这种情况下非常重要:在调用回调函数(使用该config.resource值)之前,您创建一个新实例,然后更改config.resource属性。直到构造第二个实例之后才会调用回调函数。这就是为什么config.resource值在调用之间的那一瞬间发生变化的原因addTweets并调用异步回调,因为那是创建第二个实例的时间。就这么简单,真的。

于 2013-01-18T09:34:21.167 回答