Backbone Collection在接收​​服务器响应时产生错误

时间:2011-09-30 22:31:43

标签: javascript rest backbone.js tweets

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

所以这是场景:

  1. 用户验证
  2. backbone app初始化并发送第一个请求:window.timeline.fetch();
  3. window.timeline是一个主干集合,其网址为:/ connect / timeline /
  4. 服务器在json中返回10条最近的推文,window.timeline使用Tweet模型添加它们,并将最后的Tweet id保存在变量中。
  5. 骨干视图呈现并显示它们并触发计时器
  6. 计时器开始计时并运行window.timeline.fetch({add:true});每隔10秒,添加/ ID /添加获取URL的结尾,告诉Twitter API返回推文,因为该ID
  7. 因为我传递了add选项,当服务器返回对象时,它会触发“add”事件并将其绑定到一个方法,该方法会添加每条推文和列表的顶部并保存最后一条推文ID以便在下一个计时器中使用剔。
  8. 问题是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;
        }
    });
    

    谢谢(对不起我的英文)

1 个答案:

答案 0 :(得分:1)

嗯,你肯定有竞争条件。如果您设法发送两个请求并且响应速度非常慢的服务器,则可能会两次发送相同的推文。我不确定你的情况是否存在问题,但肯定是一种选择。

鉴于这是您的问题的根源,您至少有两个选项可以解决它:

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

修改

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

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