用于更新骨干模型/视图轮询请求(Polling request for updating Backb

2019-07-30 09:34发布

我需要找到一种方法来更新网络应用与实施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
    }
});

Answer 1:

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

// 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);
    }
});


Answer 2:

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

1)您的代码似乎违背你写的标题是什么。 使用setTimeout (或setInterval )连续轮询是不同的东西,然后长轮询。 其实这是一个(正常)查询。 不同的是,与长轮询客户端启动一个AJAX请求和他等待。 服务器决定何时作出回应。 它应该只有当新的数据是可用的响应。 和响应客户端启动一个新的轮询请求后,立刻。

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

真正的问题,只要你知道这是怎么回事你的代码中2),你如何处理客户端(即你把长轮询逻辑)没有。 当然,要记住,也许在未来,你想作一些修改代码,因此保持它分开可能会是一个最好的选择。 下面是我会选择的架构:

  • 独立脚本,创建全球EventManager对象(此脚本应该加载的第一个)。 这样的对象将有以下几种方法: .bind.trigger ,它会,呃......管理事件。 :)下面是例如实现可能什么样子:

实现我自己的对象事件

  • 独立脚本处理长轮询。 每当数据被从所述服务器接收(即,AJAX长轮询请求终于结束)它调用EventManager.trigger('long_polling_data', res); 。 然后,你需要绑定到该事件的骨干视图或任何你喜欢里面。

附注 :此体系结构的其他好处是,如果你决定要切换到的WebSockets或任何其他技术(例如:JSONP轮询),那么你将只需要实现对其他技术的逻辑。 主要的代码将只使用long_polling_data事件,所以没有进一步变化将需要(您可能要改变事件的名称:])。

3)虽然你说你不想使用WebSockets我对此发表评论。 :)你知道,世界是不断变化的。 你应该忘掉长轮询techniquesl。 使用的WebSockets和的XMLSocket(又名FlashSocket)作为后备更加高效,这是一个很大simplier实现服务器端。

我希望我帮一点,对不起任何语言错误,好运与您的项目!



Answer 3:

我知道你在你的问题,你不希望使用的PHP的WebSockets(由于它是不是那么简单)的状态,但是,我发现它是相对简单的。

  1. 我用http://pusher.com/它是一个网络插座应用与回退。 (我不是的方式与本公司)。
  2. 包括https://github.com/squeeks/Pusher-PHP在服务器/ API
  3. 包括<script src="http://js.pusherapp.com/1.12/pusher.min.js"></script>在客户端。

客户端和服务器的信道可以被设置相互使用网络套接字来说话。



文章来源: Polling request for updating Backbone Models/Views