我有一个Backbone应用程序,它有一个名为Links
的集合。Links
映射到/api/links
的REST API URI
API将为用户提供最新的链接。但是,我有一个系统,当用户点击这个API时,它将向消息队列添加一个作业,请求更新数据库中的链接。
当这项工作完成后,我将将新链接推送到到Backbone集合。
我该怎么做?在我看来,我有两个选择:
- 从Backbone集合中,长轮询API以获取新链接
- 设置WebSockets在任务完成时向集合发送"消息",并发送新数据
- 废弃我的应用程序的REST API,只是使用WebSockets的一切,因为我可能有更多的实时需求以后的线
带有REST API的WebSockets
如果我使用WebSockets,我不确定将其集成到我的Backbone集合中的最佳方法,以便它与REST API一起工作。
现在我的Backbone集合是这样的:
var Links = Backbone.Collection.extend({
url: '/api/links'
});
我不确定如何使主干集合处理AJAX 和 WebSockets。我是否继续使用默认的Backbone。同步CRUD Ajax操作,然后手动处理单个WebSocket连接?在我心中:
var Links = Backbone.Collection.extend({
url: '/api/links',
initialize: function () {
var socket = io.connect('http://localhost');
socket.on('newLinks', addLinks)
},
addLinks: function (data) {
// Prepend `data` to the collection
};
})
我应该如何实现我的实时需求,从上面的选项或任何其他想法你有?请提供代码示例以给出一些上下文
别担心!骨干。WS帮你搞定了。
你可以这样初始化WebSocket连接:
var ws = new Bakcbone.WS('ws://exmaple.com/');
并将Model绑定到它,如:
var model = new Backbone.Model();
ws.bind(model);
然后这个模型将监听类型为ws:message
的消息事件,您可以调用model.send(data)
通过该连接发送数据。
当然集合也是如此。
骨干。WS还提供了一些工具,用于将类似rest的自定义API映射到模型/集合。
我公司有一个完整的Socket。基于IO的解决方案使用骨干,主要是因为我们希望我们的应用程序"更新"GUI时,另一个用户的屏幕上的变化实时。
简而言之,这是一个棘手的问题。套接字。IO工作得很好,但它也打开了很多你可能不感兴趣的门。骨干事件变得非常不正常,因为它们与ajax事务紧密地联系在一起……你有效地覆盖了默认行为。我们的一个较好的问题是删除,因为我们的套接字响应不是被更改的模型,而是整个集合。我们的解决方案确实比大多数解决方案走得更远,因为事务是通过DDL进行的,该DDL是专门设置为在许多设备上通用的,我们现在和将来都需要能够与之通信。如果你选择ioBind路径,注意你将使用与非套接字流量不同的方法来处理更改事件(如果你混合和匹配)。这是该方法的最大缺点,例如,像"change"这样的标准内容变成了"update",以避免冲突。在深夜调试或新开发人员加入团队时,情况会变得非常混乱。出于这个原因,我宁愿要么使用套接字,要么不使用,而不是组合使用。到目前为止,套接字还不错,而且速度快得吓人。
我们使用一个基本函数来完成繁重的工作,并且有几个其他的扩展这个基本函数来提供我们需要的事务功能。
本文为我们使用的方法提供了一个很好的开端。