8

我有一个 Backbone 应用程序,它有一个名为Links. Links映射到/api/links.

API 将为用户提供最新的链接。但是,我有一个系统,当用户点击这个 API 时,它将向消息队列添加一个作业,请求更新数据库中的链接。

当这项工作完成后,我会将新链接推送到 Backbone 集合。

我该怎么做?在我看来,我有两个选择:

  • 从 Backbone 集合中,长轮询 API 以获取新链接
  • 设置 WebSockets 以在作业完成时向集合发送“消息”,并与它一起发送新数据
  • 为我的应用程序废弃 REST API,只为所有事情使用 WebSocket,因为我以后可能会有更多的实时需求

带有 REST API 的 WebSocket

如果我使用 WebSockets,我不确定将它集成到我的 Backbone 集合中以便它与 REST API 一起工作的最佳方式。

目前我的 Backbone 集合看起来像这样:

var Links = Backbone.Collection.extend({
  url: '/api/links'
});

我不确定如何启用 Backbone 集合来处理 AJAXWebSocket。我是否继续使用默认的 Backbone.sync 进行 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
  };
})

问题

我应该如何根据上述选项或您的任何其他想法来实现我的实时需求?请提供代码示例以提供一些上下文。

4

2 回答 2

1

不用担心!Backbone.WS 为您提供保障。

你可以像这样初始化一个 WebSocket 连接:

var ws = new Bakcbone.WS('ws://exmaple.com/');

并将模型绑定到它,例如:

var model = new Backbone.Model();
ws.bind(model);

然后此模型将侦听该类型的消息事件,ws:message您可以调用model.send(data)以通过该连接发送数据。

当然,集合也是如此。

Backbone.WS 还提供了一些工具,用于将自定义的类似 REST 的 API 映射到您的模型/集合。

于 2015-08-11T11:40:30.083 回答
0

我的公司有一个使用主干的完全基于 Socket.io 的解决方案,主要是因为我们希望我们的应用程序在另一个用户屏幕上实时进行更改时“更新”gui。

简而言之,这是一罐蠕虫。Socket.IO 运行良好,但它也打开了很多你可能不感兴趣的门。骨干事件变得非常不正常,因为它们与 ajax 事务紧密相关……您实际上是在覆盖该默认行为。我们更好的问题之一是删除,因为我们的套接字响应不是改变的模型,而是整个集合,例如。我们的解决方案确实比大多数解决方案走得更远,因为交易是通过一个 DDL 进行的,该 DDL 专门设置为在我们现在和将来需要能够与之通信的许多设备上通用。

如果您确实走 ioBind 路径,请注意,与非套接字流量相比,您将使用不同的方法来更改事件(如果混合和匹配)这是该方法的最大缺点,诸如“更改”之类的标准内容变为“更新”,例如避免冲突。在深夜调试或有新开发人员加入团队时,它会变得非常混乱。出于这个原因,我更喜欢使用套接字,或者不使用套接字,而不是组合。到目前为止,套接字一直很好,而且速度很快。

我们使用一个基础函数来完成繁重的工作,并有几个其他函数扩展了这个基础,为我们提供了我们需要的事务功能。

本文为我们使用的方法提供了一个很好的开端。

于 2015-03-17T20:11:06.830 回答