record
records是deepstream的实时数据store中的文档. 他们是原子粒度的json数据. 任何对record的改变都会立即在所有连接客户端同步. 获取record的方式是: client.record.getRecord(name), 如果特定名字的record不存在将会自动建立它. 如果你只是想检查一个record是否存在, 可以使用client.record.has(name, callback).
record有set()和get()方法, 并且可以通过subscribe()来通知你改变.
为了通知服务你不再对某个record的更新感兴趣, 使用discard().
如果你只是想获得一次过的静态的数据视图, 使用client.record.snapshot(name, callback)
record命名
const book = client.record.getRecord('book/iq6auu7d-p9i1vz3q0yi')
book是record的类别, 后面跟的是唯一id. 可以用client.getUid()来生成.
让用户名作为record名的一部分. 比如:
settings/username
这样就比较好指定操作.
List
list是recordname的observable数组. (注意不是数据)
list和recordname是多对多关系.
list方法:
addEntry(recordName, index)
removeEntry(recordName)
isEmpty
除此以外, list非常类似record, 它会通知你何时whenReady(), 可以被subscribe(), 用完后也可以被discard()
list的用途:
- 任何时候records需要被合并成一个集合时, 可以用List
举例
假设一个todo的记录由以下唯一名字识别:
todo/ikfndiqx-43jdj23bsdf
但这并不意味着自动会把这个记录加入到todos的列表.
为了把我们的任务组织成叫做todos的列表, 我们需要显式地建立它:
var todos = ds.record.getList('todos')
然后我们添加条目:
todos.setEntries([ 'todo/ikfndidw-1973pnhmyk7', 'todo/ikfndiqx-43jdj23bsdf', 'todo/ikfndidt-5sdk3zag354'
deepstream的数据结构
Recordnames 是轻量的字符串, 可以被轻松的来回传递, 比如, 作为react组件的属性.
代码
首先初始化record:
-
切换行号显示
1 this.ds = createDeepstream('localhost:6020'); // 最高层级 datastore 2 .... 3 this.client = this.ds.login( 4 { 5 type: 'webhook', 6 email: 'xx@xx.com', 7 password: 'xxxx' 8 } 9 ); // 登录后获得全局client 10 11 this.record = this.client.record.getRecord('test/gogo') // client操作后得到record 12 ... 13 <Record record={this.record}></Record> // record作为属性传递给组件 14 ... 15 this.record.subscribe(value => { 16 this.setState({firstname: value.firstname}); 17 this.setState({lastname: value.lastname}); 18 }); // Record组件挂钩监听方法 19 20 ... 21 this.record.set('lastname', e.target.value); // Record组件用户交互(input)更改datastore值. 此时上面的subscribe又检测到更改, 于是改变本地状态. 整个链条打通 22
login过程中建立record, 建立list, 然后把record加入到list里
-
切换行号显示
1 userId = 'users/' + clientData.id 2 userEmail = email 3 // 建立一个list, 名字是users, 见1.2.1 4 var list = ds.record.getList('users'); 5 // 异步操作, whenReady后处理 6 list.whenReady(()=>{ 7 // 不能找到login的userId? 8 if(list.getEntries().indexOf(userId)===-1) { 9 // 建立一个record, 实时文档, 给定主关键字为 /users/xxxxxx, 赋值给rec进行后续操作 10 var rec = ds.record.getRecord(userId); 11 // 异步操作, whenReady后处理 12 rec.whenReady(()=> { 13 // 为rec实时文档增加其他字段, 比如email 14 rec.set('email', email) 15 // 把更新好的rec添加到list类别中 16 list.addEntry(userId); 17 // 宣布停止对rec的更新关注 18 rec.discard(); 19 }) 20 } 21 // 如果已经有login用户userId, 直接返回(resolve). 本身是异步函数 22 resolve(); 23 })