javascript – 如何将websocket与emberjs集成?

我正在学习并使用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);
        }

    });
});

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ "TOC" 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...