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 の 2 つの新しいオブジェクトを作成すると、

    var l1 = new lister('user1'); //user1 and user2 refer to url of the timelines 
    l1.listerstrap();
    var l2 = new lister('user2');
    l2.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 で行われているように、リストごとに異なる列があります)。両方の URL からツイートを取得しますが、同じ列に設定されています。_ には、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オブジェクト ( 1 つしかない) をUser1設定すると、addTweets関数が呼び出されます。この関数は、非同期リクエストを実行します。非同期は見過ごされがちですが、この場合は非常に重要です。(config.resource値を使用する) コールバック関数が呼び出される前に、新しいインスタンスを作成し、次にプロパティconfig.resourceを変更します。コールバック関数は、2 番目のインスタンスが構築されるまで呼び出されません。そのため、config.resource呼び出しの間に一瞬で値が変更されますaddTweets非同期コールバックが呼び出されます。これは、2 番目のインスタンスが作成されるためです。それは本当にそれと同じくらい簡単です。

于 2013-01-18T09:34:21.167 に答える