1

我正在为我自己的朋友制作一个 twitter 客户端,并使用 Backbone.js 和一个使用 Twitter oAuth API 的 php 后端来制作它。

所以这是场景:

  1. 用户认证
  2. 主干应用程序初始化并发送第一个请求:window.timeline.fetch();
  3. window.timeline 是一个主干集合,它的 url 是:/connect/timeline/
  4. 服务器以 json 格式返回 10 条最近的推文,window.timeline 使用推文模型添加它们,并将最后一条推文 ID 保存在一个变量中。
  5. 主干视图呈现并显示它们并触发计时器
  6. 计时器开始计时并运行 window.timeline.fetch({add: true}); 每 10 秒,并添加 /ID/ 添加获取 URL 的末尾,以告诉 twitter API 从该 ID 返回推文
  7. 因为我通过了添加选项,所以当服务器返回对象时,它会触发“添加”事件,我将它绑定到一个方法,该方法添加每条推文和列表的顶部,并保存最后一个推文 id 以在下一个计时器滴答中使用。

问题是 tweeter 有时会两次返回相同的推文(如 RT 和其他东西),并且由于该 ID 存在于骨干集合中,因此会产生此错误:

未捕获的错误:无法将同一模型添加到集合中两次,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

好吧,您当然有比赛条件。如果您设法发送两个请求并且有一个响应非常缓慢的服务器,您可能会收到两次相同的推文。我不确定这是否是您的问题,但它肯定是一种选择。

鉴于这是您的问题的根源,您至少有两种选择来解决它:

  • 维护一些标志,表明您是否正在等待服务器响应。这将允许您防止从同一个客户端实例同时发送两个请求。注意:这与同步请求不同。后者会阻止您的用户界面!
  • 您还可以检查具有返回 id 的推文是否已经存在,然后才继续。然而,这有点危险,因为它可能会隐藏你的实现更深层次的问题。

编辑

我认为你的问题只是 url/timeline/SOME-ID-HERE返回所有最新的推文,直到给定的 id inclusive。我已经检查了您的应用程序发送的请求的内容。第一个/timeline很长,以 id 结尾119912841942802432。这是您的第二个请求中返回的唯一 id。

我不明白地址中的 ID 与您的推文 ID 有什么关系。第二个请求地址是/timeline/119912841942802430。另一方面119912841942802430,结果中的任何内容都不匹配。119912841942802432(注意2而不是0最后)确实如此。

于 2011-09-30T23:01:58.400 回答