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



我正在为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);
}

然后我有一个适配器,它必须根据成员数据文档实现几个函数(find()findAll()createRecord()…)。所有这些函数都需要返回一些值,例如数组。通过这种方式,我可以说this.store.find('...'),并立即返回一些实体。

但是有了套接字,就有了某种异步的数据检索方式。你是怎么处理的?例如:我的适配器的find()函数可以通过sendMessage()发送消息以获取实体。但它不能立即返回实体,因为答案(=实体)是通过socket.onmessage发回的。那么,有没有办法妥善处理这个问题呢?

实际上,没有一个Ember数据适配器立即返回对象。他们会怎么做?REST也是异步的。:)他们返回的是对象的代理。具体为DS.PromiseObjectDS.PromiseArray。它们允许您像处理真实对象一样处理对象,并且一旦异步promise解析,绑定就会自动更新。

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

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
    });
}

这就是内置适配器处理事情的方式,所以这将表现出与您在其他适配器中看到的完全相同的行为。

相关内容

  • 没有找到相关文章

最新更新