Javascript 用于更新主干模型/视图的轮询请求

Javascript 用于更新主干模型/视图的轮询请求,javascript,backbone.js,websocket,long-polling,polling,Javascript,Backbone.js,Websocket,Long Polling,Polling,我需要找到一种方法来更新用主干网实现的web应用程序 用例如下: 我有几个视图,每个视图,或者可能是与此视图相关的模型/集合, 需要在不同的时间向服务器发出不同的轮询请求以发现某些更改 我想知道最普遍的方法是什么: 1) 执行传统轮询请求 2) 执行长轮询请求 3) 实现HTML5 web套接字 附言: 1) 服务器是用PHP编写的。 2) 目前,我正在寻找一种不使用HTML5WebSockets的解决方案,因为使用PHP可能不是那么简单 下面是我使用传统轮询请求的简单代码(1) (一) 我

我需要找到一种方法来更新用
主干网实现的web应用程序

用例如下:
我有几个视图,每个视图,或者可能是与此视图相关的模型/集合, 需要在不同的时间向服务器发出不同的轮询请求以发现某些更改

我想知道最普遍的方法是什么:

1) 执行
传统轮询请求

2) 执行长轮询请求

3) 实现HTML5 web套接字


附言:
1) 服务器是用PHP编写的。
2) 目前,我正在寻找一种不使用HTML5WebSockets的解决方案,因为使用PHP可能不是那么简单


下面是我使用
传统轮询请求的简单代码(1)

(一)



我不知道你在问什么,但这里有一些想法:

1)您的代码似乎与您在标题中所写的内容相矛盾。使用
setTimeout
(或
setInterval
)进行连续轮询与长轮询不同。实际上这是一个(正常的)投票。不同之处在于,对于长轮询,客户端启动AJAX请求并等待。服务器决定何时响应。而且它应该只在新数据可用时才做出响应。并且在响应客户端启动新的轮询请求后立即执行

旁注:创建(相对)高效的长轮询服务器不是一项容易的任务,请注意这一点

2)只要您知道代码内部发生了什么,如何处理客户端(即在何处放置长轮询逻辑)实际上并不重要。当然,请记住,也许将来您希望对代码进行一些更改,因此将其分开可能是最佳选择。以下是我将选择的体系结构:

  • 创建全局
    EventManager
    对象的独立脚本(此脚本应作为第一个脚本加载)。这样的对象将具有以下方法:
    .bind
    .trigger
    ,它将。。。管理事件。:)以下是实施的示例:

  • 处理长轮询的独立脚本。无论何时从服务器接收到数据(即AJAX长轮询请求最终结束),它都会调用
    EventManager.trigger('long\u polling\u data',res)。然后,您需要在主干视图内或任何您喜欢的地方绑定到该事件
旁注:这种架构的额外好处是,如果您决定切换到WebSocket或任何其他技术(例如:JSONP轮询),那么您只需要实现其他技术的逻辑。主代码将只使用
long\u polling\u data
事件,因此不需要进行其他更改(您可能希望更改事件的名称:)

3)虽然你说你不想使用WebSocket,但我必须对此发表评论。:)你们知道这个世界在不断地进化。你应该忘记长轮询技术。使用WebSockets和XMLSocket(又称FlashSocket)作为后备方案更有效,实现服务器端也更简单


我希望我能帮上一点忙,为语言错误感到抱歉,祝你的项目好运

在您的模型中实现轮询处理程序,检查以下示例:

// MyModel
var MyModel = Backbone.Model.extend({
  urlRoot: 'backendUrl',

  //Add this to your model:
  longPolling : false,
  intervalMinutes : 2,
  initialize : function(){
    _.bindAll(this);
  },
  startLongPolling : function(intervalMinutes){
    this.longPolling = true;
    if( intervalMinutes ){
      this.intervalMinutes = intervalMinutes;
    }
    this.executeLongPolling();
  },
  stopLongPolling : function(){
    this.longPolling = false;
  },
  executeLongPolling : function(){
    this.fetch({success : this.onFetch});
  },
  onFetch : function () {
    if( this.longPolling ){
      setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes
    }
  }
});

// MyView
var MyView = Backbone.View.extend({

    initialize: function () {
        this.model = new MyModel();
        this.model.startLongPolling();
        this.model.on('change', this.render);
    }
});

我知道您在问题中表示不希望将WebSocket与php一起使用(因为它不是那么简单),但是,我发现它相对简单

  • 我使用了一个带有回退功能的web套接字应用程序。(顺便说一句,我与公司无关)
  • 包括在服务器/api上
  • 在客户端包含

  • 客户机和服务器频道可以设置为使用web套接字相互对话。

    感谢您的回复。我确实将我的问题的标题从长轮询改为传统轮询。我添加了关于我的问题的更多细节。也许它可以帮助你给我更多关于如何使用webSocket的信息。谢谢。对不起,我不是PHP开发人员,我不能帮你。除非您愿意学习Python或服务器端JavaScript.:]现在回想起来,对于没有经验的开发人员来说,实现长轮询和/或WebSocket可能有点困难。如果您不会发出很多请求,那么正常的轮询也应该可以工作。这很容易实现,只需使用
    setTimeout
    。如果您了解asp.net,您可以查看SignalR,它使客户机-服务器交互非常容易,并且它会根据php中的浏览器功能SwebSocket自动选择适当的连接模型。旧代码,作者称之为快速黑客。。。还是值得一看的。php中的websocket更有希望:感谢您的回复。pusher php看起来很有趣。pusher php看起来很有趣,但我必须为此付费!!即使绑定this.model.on('change',this.render'),作用域也不明确//不明确的作用域——我的案例是models作用域this.model.on('change',this.render,this)//范围view@hharnisc这不是含糊不清的,因为我在初始化“u.bindAll(this);”时使用了这个词。这实际上是长轮询,还是您只是在使用那个词?我的理解是,在长时间轮询中,您打开到服务器的单个连接并等待响应。这看起来像是在不断地进行轮询。@Ziggy您对技术的定义不好。“打开单个连接”技术称为“推送技术”。长轮询请求“模拟”了“推送技术”,适用于无法使用套接字连接(由推送使用)的情况。长轮询请求模拟它在任何给定时间向服务器询问有关更新的信息。对于客户端,代码是相同的。正常轮询和长轮询之间的区别在于服务器代码。投票和投票的区别
    // MyModel
    var MyModel = Backbone.Model.extend({
      urlRoot: 'backendUrl',
    
      //Add this to your model:
      longPolling : false,
      intervalMinutes : 2,
      initialize : function(){
        _.bindAll(this);
      },
      startLongPolling : function(intervalMinutes){
        this.longPolling = true;
        if( intervalMinutes ){
          this.intervalMinutes = intervalMinutes;
        }
        this.executeLongPolling();
      },
      stopLongPolling : function(){
        this.longPolling = false;
      },
      executeLongPolling : function(){
        this.fetch({success : this.onFetch});
      },
      onFetch : function () {
        if( this.longPolling ){
          setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes
        }
      }
    });
    
    // MyView
    var MyView = Backbone.View.extend({
    
        initialize: function () {
            this.model = new MyModel();
            this.model.startLongPolling();
            this.model.on('change', this.render);
        }
    });