我正在为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.PromiseObject
和DS.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
});
}
这就是内置适配器处理事情的方式,所以这将表现出与您在其他适配器中看到的完全相同的行为。