Javascript 主干收集在接收服务器响应时产生错误

Javascript 主干收集在接收服务器响应时产生错误,javascript,rest,backbone.js,tweets,Javascript,Rest,Backbone.js,Tweets,我正在为我自己的朋友制作一个twitter客户端,我正在使用Backbone.js和一个使用twitter oAuth API的php后端制作它 下面是一个场景: 用户验证 主干应用程序初始化并发送第一个请求:window.timeline.fetch() window.timeline是一个主干集合,其url为:/connect/timeline/ 服务器以json和window返回10条最近的推文。timeline使用推文模型添加它们,并将最后一条推文id保存在变量中 主干视图渲染和显示它们

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

下面是一个场景:

  • 用户验证
  • 主干应用程序初始化并发送第一个请求:window.timeline.fetch()
  • window.timeline是一个主干集合,其url为:/connect/timeline/
  • 服务器以json和window返回10条最近的推文。timeline使用推文模型添加它们,并将最后一条推文id保存在变量中
  • 主干视图渲染和显示它们并触发计时器
  • 计时器开始计时并运行window.timeline.fetch({add:true});每10秒添加一次/ID/add作为获取URL的结尾,以告知twitter API从该ID返回tweets
  • 由于我传递了add选项,当服务器返回该对象时,它会触发“add”事件,我将其绑定到一个方法,该方法将添加每个tweet和列表的顶部,并保存最后一个tweet id,以便在下一个计时器计时中使用
  • 问题是tweeter有时会两次返回同一条tweet(如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;
        }
    });
    

    谢谢(对我的英语很抱歉)

    你当然有比赛条件。如果你发送了两个请求,而服务器的响应速度非常慢,那么你可能会收到两条相同的tweet。我不确定这是否是你的问题,但这肯定是一个选择

    鉴于这是问题的根源,您至少有两种解决方案:

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

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


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

    你当然有比赛条件。如果你发送了两个请求,而服务器的响应速度非常慢,那么你可能会收到两条相同的tweet。我不确定这是否是你的问题,但这肯定是一个选择

    鉴于这是问题的根源,您至少有两种解决方案:

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

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


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

    我添加了一个计时器类,在发送新请求时暂停它,在请求完成时恢复它(成功回调)。不是这样的。我已经向您提供了源代码:@SallarKaboli好的,我会尝试深入挖掘。@SallarKaboli您有这个Timer.js脚本的未压缩源代码吗?没有,抱歉:(它有四个主要方法:开始、停止、暂停、恢复。不过这里有一个美化的版本:那么我应该在将这个特定对象发送回客户端之前从结果中删除它吗?比如,$v->id=$sinceId)继续;如果是,我现在就编辑代码,看看会发生什么。谢谢。我添加了一个计时器类,在发送新请求时暂停它,在请求完成时恢复它(成功回调)。不是这样。我已经向您提供了源代码:@SallarKaboli好的,我会尝试深入挖掘。@SallarKaboli您有这个Timer.js脚本的未压缩源代码吗?没有,抱歉:(它有四个主要方法:开始、停止、暂停、恢复。不过这里有一个美化的版本:那么我应该在将结果发送回客户端之前从结果中删除这个特定对象吗?比如如果($v->id==$sinceId)继续;如果是,我现在就编辑代码,看看会发生什么。谢谢。