1

私は自分の友達のためにTwitterクライアントを作成しており、Backbone.jsとTwitteroAuthAPIを使用したphpバックエンドを使用して作成しています。

シナリオは次のとおりです。

  1. ユーザーが認証します
  2. バックボーンアプリが初期化され、最初のリクエストが送信されます:window.timeline.fetch();
  3. window.timelineはバックボーンコレクションであり、そのURLは/ connect /timeline/です。
  4. サーバーはjsonとwindowで最近の10件のツイートを返します。timelineはツイートモデルを使用してそれらを追加し、最後のツイートIDを変数に保存します。
  5. バックボーンビューはそれらをレンダリングして表示し、タイマーをトリガーします
  6. タイマーがカチカチ音をたて始め、window.timeline.fetch({add:true});を実行します。10秒ごとに、/ ID /を追加してフェッチURLの末尾を追加し、TwitterAPIにそのID以降のツイートを返すように指示します
  7. 追加オプションを渡したので、サーバーがオブジェクトを返すと、「追加」イベントがトリガーされ、すべてのツイートとリストの一番上を追加し、次のタイマーティックで使用する最後のツイートIDを保存するメソッドにバインドします。

問題は、ツイーターが同じツイートを2回返すことがあり(RTなど)、そのIDがバックボーンコレクションに存在するため、次のエラーが発生することです。

キャッチされないエラー:同じモデルをセットに2回追加することはできません。119896811958833150

プログラムを終了します。どうすればこの状況を制御できますか?またはこれを行うためのより良い方法はありますか?

window.Tweet  = Backbone.Model.extend({});
window.Timeline = Backbone.Collection.extend({
    model: Tweet,
    url: function(){
        var id = (window.lastId) ? window.lastId + "/?" + Math.floor(Math.random()*99999) : "";
        return "/connect/timeline/" + id;
    }
});

ありがとう(そして私の英語でごめんなさい)

4

1 に答える 1

1

確かに競合状態があります。2つのリクエストを送信し、サーバーの応答が非常に遅い場合、同じツイートを2回受け取る可能性があります。それがあなたの場合の問題であるかどうかはわかりませんが、それは確かにオプションです。

これが問題の原因であるとすると、それを解決するための少なくとも2つのオプションがあります。

  • サーバーの応答を待機しているプロセスにあるかどうかを示すフラグを維持します。これにより、同じクライアントインスタンスから2つのリクエストを同時に送信することを防ぐことができます。注:これは同期リクエストと同じではありません。後者はあなたのUIをブロックします!
  • 返されたIDのツイートがすでに存在するかどうかを確認して、続行することもできます。ただし、これは実装に関するより深い問題を隠す可能性があるため、少し危険です。

編集

問題は、指定されたIDが含まれるまでurlがすべて/timeline/SOME-ID-HEREの最新のツイートを返すことだけだと思います。アプリケーションが送信するリクエストの内容を確認しました。最初のものは長く、idで終わります。そして、これは2番目のリクエストで返される唯一のIDです。/timeline119912841942802432

私が理解していないのは、アドレスのIDがツイートのIDとどのように関連しているかです。2番目のリクエストアドレスは/timeline/119912841942802430です。一方119912841942802430、結果の何にも一致しません。(最後ではなく119912841942802432通知)します。20

于 2011-09-30T23:01:58.400 に答える