我正在尝试用通过WebSockets同步的函数覆盖默认的Backbone.sync函数。到目前为止,我已经设法使用以下代码成功向服务器发送了获取请求,但我不知道如何捕获响应。
我看到有人建议每次都重置套接字消息事件处理程序,但我忍不住认为,如果一次请求大量数据(如果一个请求需要很长时间才能响应),这可能会导致响应不同步。
有没有关于如何实现我想要做的事情的例子?
var app = app || {};
function fnSync (sMethod, oModel, oOptions) {
var bSuccess,
sResponse;
bSuccess = false;
switch (sMethod) {
case "read":
if (oModel.id !== undefined) {
app.socket.send(JSON.stringify({
"method": "get",
"url": oModel.url,
"id": oModel.get("_id")
}));
} else {
app.socket.send(JSON.stringify({
"method": "get",
"url": oModel.url
}));
}
bSuccess = true;
break;
default:
throw "Backbone.sync doesn't know how to " + sMethod;
bSuccess = false;
break;
}
(bSuccess) ? oOptions.success() : oOptions.error();
}
(function () {
app.socket = new WebSocket("ws://localhost:3001");
app.socket.onopen = function () {
Backbone.sync = fnSync;
app.router = new app.Router();
Backbone.history.start();
}
app.socket.onmessage = function (oMessage) {
//console.log("Socket message", oMessage.data);
}
})();
您可以查看 Backbone.WS 项目,了解如何通过本机 WebSocket 使用骨干资源。
我们使用的技术涉及在socket.onmessage
处理程序中使用 Backbone-relational 和 Model.findOrCreate({id: response.id})
,以便在找到更新时通过简单的model.set()
调度更新。
在我们没有 ID 的情况下,我们使用仅限客户端的临时 ID,API 旨在忽略这些临时 ID 并按原样返回,以便我们可以区分和跟踪响应。