15

我需要找到一种方法来更新使用backbone.

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

我想知道最一般的方法是什么:

1) 执行Traditional Polling Request
2) 执行Long Polling Request
3) 执行HTML5 web socket


PS:
1)服务器是用PHP编写的。
2) 现在我正在寻找一个不使用 HTML5 WebSockets 的解决方案,因为 PHP 可能不是那么简单。


这是我的简单代码(1),使用Traditional Polling Request.

(1)

// MyModel
var MyModel = Backbone.View.extend({
    urlRoot: 'backendUrl'
});

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

    initialize: function () {
        this.model = new MyModel();
        this.model.fetch();
        this.model.on('change', this.render);
        setTimeout(function () {
            this.model.fetch();
        }, 1000 * 60 * 2); // in order to update the view each two minutes
    }
});

4

3 回答 3

18

在你的模型中实现它的轮询处理程序,检查这个例子:

// 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);
    }
});
于 2012-07-16T15:24:17.410 回答
11

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

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

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

2)你如何处理客户端(即你把长轮询逻辑放在哪里)并不重要,只要你知道你的代码里面发生了什么。当然请记住,将来您可能希望对代码进行一些更改,因此将其分开可能是最佳选择。这是我会选择的架构:

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

在我自己的对象中实现事件

  • 处理长轮询的独立脚本。每当从服务器接收到数据(即 AJAX 长轮询请求最终结束)时,它都会调用EventManager.trigger('long_polling_data', res);. 然后,您需要在主干视图内或您喜欢的任何地方绑定到此事件。

旁注:这种架构的额外好处是,如果您决定切换到 WebSockets 或任何其他技术(例如:JSONP 轮询),那么您只需实现其他技术的逻辑。主代码将只使用long_polling_data事件,因此不需要额外的更改(您可能想要更改事件的名称:])。

3)虽然你说你不想使用 WebSockets 我不得不对此发表评论。:) 你知道世界在不断发展。你应该忘记长轮询技术。使用 WebSockets 和 XMLSocket(又名 FlashSocket)作为后备方案效率更高,实现服务器端也更简单。

我希望我能帮上忙,对任何语言错误感到抱歉,祝你的项目好运!

于 2012-07-12T14:11:17.303 回答
2

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

  1. 我使用了http://pusher.com/,这是一个带有后备功能的 Web 套接字应用程序。(顺便说一句,我与公司没有联系)。
  2. 在服务器/api 上包含https://github.com/squeeks/Pusher-PHP
  3. 包括<script src="http://js.pusherapp.com/1.12/pusher.min.js"></script>在客户端。

客户端和服务器通道可以设置为使用 Web 套接字相互交谈。

于 2012-07-17T09:23:03.633 回答