我正在为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
发回的。那么有办法正确处理这个吗?
答案 0 :(得分:0)
实际上,没有一个Ember-Data适配器立即返回对象。他们怎么样? REST也是异步的。 :)他们返回的是对象的代理。具体而言,DS.PromiseObject
和DS.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
});
}
这就是内置适配器处理事物的方式,因此这将表现出与其他适配器一样的完全相同的行为。