2011-12-31 12 views
2

私はJavaScriptには比較的新しいので、パラメータとしてコールバックを取るヘルパーオブジェクトにメソッドを書くことを繰り返しています。これは悪いコールバックの練習ですか?

var utilities = { 
    getTweets: function (user, maxTweets, callBack) { 
      var obj = $(this); 
      $.getJSON('http://api.twitter.com/1/statuses/user_timeline.json?callback=?&screen_name=' + user + "&count=" + maxTweets, function (data) { 
       callBack(data); 
      }); 
    }; 

Iその後、そのようにそれを呼び出す:私はしたsetIntervalを使用して上記のコードを呼び出しています考える

utilities.getTweets("TESTUSER", 4, function (tweets) { 
       ..... 
      }); 

が、これは時間をかけて漏れる可能性がある/これを書くための良い方法はありますか?

あなたはこのような何か使用することができ

答えて

10

余分な閉鎖を作成する必要がないことを除いて、あなたがやっていることはほとんどうまくあります。以下のように書かれたクロージャを渡す:

function (data) { 
     callBack(data); 
} 

は、パラメータリストで直接callBackを渡すのとちょうど同じです。

あなたはjQueryの1.5以降で動作して保証できる場合は、その後、より良い方法は、単にJQXHRオブジェクトを返すgetTweets()持つことで、その後、あなたはクライアントコードで「繰延」メソッドを使用することができます

var utilities = { 
    getTweets: function (user, maxTweets) { 
     var uri = 'http://api.twitter.com/1/statuses/user_timeline.json?callback=?'; 
     var data = { 
      screen_name: user, 
      count: maxTweets 
     }; 
     return $.getJSON(uri, data); 
    }); 
}; 

し、クライアントコードで:

utilities.getTweets(user, maxTweets).done(/* your callback here */); 

このように、あなたは完全に実装からのコールバックを切り離すことができます。実際にutilitiesの実装に触れずに、複数のコールバックとエラーハンドラを登録できます。

NB:dataのマップを使用すると、コードをパラメータ注入から保護することもできます。

+0

+1これは素晴らしく清潔なアプローチです。 –

+0

+1良い1つ - 投稿後に私は余分な閉鎖を発見した。延期を使用することも素敵です。 – Sidebp

+0

@Sidebpええ、私は余分な閉鎖にも遅れて気づきました - それを編集しました。 – Alnitak

-2

var utilities = { 
    options: { 
     user: 'value', 
     maxTweets: '4' 
    } 
    getTweets: function() { 
     // access a value 
     this.options.user; 
    } 
} 

それともそれは、この記事の読み取りを持って、それはあなたが必要な正確に何であるべきオプションなどとの適切なプラグインを作成するのが最善のようになります。

http://jquery-howto.blogspot.com/2009/01/how-to-set-default-settings-in-your.html

+0

なぜどこにでもプラグインを作りたいですか?また、ここでの質問は、コールバックの処理と実装に関連しています。 – darma

+0

IMHOのデザインが悪いです - オプションは永続的な状態(ベースURLなど)でなければなりません。すべての関数呼び出しで変更されるパラメータではありません。 – Alnitak

+0

申し訳ありませんが、私は十分にそれを完全に読んでいないでしょう! –

1

あなたがするたびにその関数を作成するためのメモリオーバーヘッドの恐れている場合、そのような何か:

utilities.getTweets("TESTUSER", 4, utilities.handleTweets); 

をそして、あなたはコールバックでやるようutilities.handleTweetsにあなたが。

関連する問題