带Web套接字的Ember数据适配器

时间:2014-04-19 10:14:10

标签: sockets ember.js websocket ember-data

我正在为ember数据实现一个自定义适配器,它适用于Web套接字。我目前对Web套接字的实现是这样的:

// create socket
var socket = new WebSocket('ws://' + host + '/' + path);
this.set('socket', socket);

socket.onopen = function () {
    // opened
};

socket.onmessage = function (message) {
    // message
};

sendMessage: function(message) {
    this.get('socket').send(message);
}

然后我有一个适配器,它必须根据ember数据文档(find()findAll()createRecord() ...)实现多个功能。期望所有这些函数返回一些值,例如数组。这样我可以说this.store.find('...')并立即找回一些实体。

但是对于套接字,你有一些异步的数据检索方式。你怎么处理这个?例如:我的适配器的find()函数可以通过sendMessage()发送消息以获取实体。但它无法立即返回实体,因为答案(=实体)是通过socket.onmessage发回的。那么有办法正确处理这个吗?

1 个答案:

答案 0 :(得分:0)

实际上,没有一个Ember-Data适配器立即返回对象。他们怎么样? REST也是异步的。 :)他们返回的是对象的代理。具体而言,DS.PromiseObjectDS.PromiseArray。它们允许您使用对象,就像它们是真实的一样,一旦异步承诺解析,绑定就会自动更新。

所以这是一个快速的例子(有点伪代码):

find: function(store, type, id) {
    var promise = new Ember.RSVP.Promise(function(resolve) {
        socket.emit('get data', function(data) {
            resolve(data);
        });
    });

    return DS.PromiseObject.create({
        promise: promise
    });
}

这就是内置适配器处理事物的方式,因此这将表现出与其他适配器一样的完全相同的行为。