我正在学习并使用rails构建emberjs应用程序.
在这个应用程序中,我希望数据被推送而不是被轮询到客户端应用程序.
在这个应用程序中,我希望数据被推送而不是被轮询到客户端应用程序.
For.e.g.以下片段在http://awardwinningfjords.com/2011/12/27/emberjs-collections.html
// Setup a global namespace for our code. Twitter = Em.Application.create({ // When everything is loaded. ready: function() { // Start polling Twitter setInterval(function() { Twitter.searchResults.refresh(); },2000); // The default search is empty,let's find some cats. Twitter.searchResults.set("query","cats"); // Call the superclass's `ready` method. this._super(); } });
它调查twitter API,但我的问题是如何使一个使用WebSocket连接更新其状态的EmberJS应用程序?
解决方法@H_403_11@
您必须实现一个了解如何处理WebSockets的DS.Adapter.这是一个简单的例子:
var SOCKET = 'ws://localhost:9090/some-websocket';
var ID = 'uuid';
var FIND = 'find';
var FIND_MANY = 'findMany';
var FIND_QUERY = 'findQuery';
var FIND_ALL = 'findAll';
/**
* Implementation of WebSocket for DS.Store
*/
App.Store = DS.Store.extend({
revision: 4,adapter: DS.Adapter.create({
socket: undefined,requests: undefined,send: function(action,type,data,result) {
/* Specific to your web socket server side implementation */
var request = {
"uuid": generateUuid(),"action": action,"type": type.toString().substr(1),"data": data
};
this.socket.send(JSON.stringify(request));
/* So I have access to the original request upon a response from the server */
this.get('requests')[request.uuid] = request;
return request;
},find: function (store,id) {
this.send(FIND,id);
},findMany: function (store,ids,query) {
this.send(FIND_MANY,ids);
},findQuery: function (store,query,modelArray) {
this.send(FIND_QUERY,modelArray).modelArray = modelArray;
},findAll: function (store,type) {
this.send(FIND_ALL,type);
},/* Also implement:
* createRecord & createRecords
* updateRecord & updateRecords
* deleteRecord & deleteRecords
* commit & rollback
*/
init: function () {
var context = this;
this.set('requests',{});
var ws = new WebSocket(SOCKET);
ws.onopen = function () {
};
ws.onmessage = function(event) {
var response = JSON.parse(event.data);
var request = context.get('requests')[response.uuid];
switch (request.action) {
case FIND:
App.store.load(type,response.data[0]);
break;
case FIND_MANY:
App.store.loadMany(type,response.data);
break;
case FIND_QUERY:
request.modelArray.load(response.data);
break;
case FIND_ALL:
App.store.loadMany(type,response.data);
break;
default:
throw('Unknown Request: ' + request.action);
}
/* Cleanup */
context.get('requests')[response.uuid] = undefined;
};
ws.onclose = function () {
};
this.set('socket',ws);
}
});
});
var SOCKET = 'ws://localhost:9090/some-websocket'; var ID = 'uuid'; var FIND = 'find'; var FIND_MANY = 'findMany'; var FIND_QUERY = 'findQuery'; var FIND_ALL = 'findAll'; /** * Implementation of WebSocket for DS.Store */ App.Store = DS.Store.extend({ revision: 4,adapter: DS.Adapter.create({ socket: undefined,requests: undefined,send: function(action,type,data,result) { /* Specific to your web socket server side implementation */ var request = { "uuid": generateUuid(),"action": action,"type": type.toString().substr(1),"data": data }; this.socket.send(JSON.stringify(request)); /* So I have access to the original request upon a response from the server */ this.get('requests')[request.uuid] = request; return request; },find: function (store,id) { this.send(FIND,id); },findMany: function (store,ids,query) { this.send(FIND_MANY,ids); },findQuery: function (store,query,modelArray) { this.send(FIND_QUERY,modelArray).modelArray = modelArray; },findAll: function (store,type) { this.send(FIND_ALL,type); },/* Also implement: * createRecord & createRecords * updateRecord & updateRecords * deleteRecord & deleteRecords * commit & rollback */ init: function () { var context = this; this.set('requests',{}); var ws = new WebSocket(SOCKET); ws.onopen = function () { }; ws.onmessage = function(event) { var response = JSON.parse(event.data); var request = context.get('requests')[response.uuid]; switch (request.action) { case FIND: App.store.load(type,response.data[0]); break; case FIND_MANY: App.store.loadMany(type,response.data); break; case FIND_QUERY: request.modelArray.load(response.data); break; case FIND_ALL: App.store.loadMany(type,response.data); break; default: throw('Unknown Request: ' + request.action); } /* Cleanup */ context.get('requests')[response.uuid] = undefined; }; ws.onclose = function () { }; this.set('socket',ws); } }); });