Deepstream 实时数据store

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方法:

  1. addEntry(recordName, index)

  2. removeEntry(recordName)

  3. 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的数据结构

Deepstream 实时数据store_第1张图片

Recordnames 是轻量的字符串, 可以被轻松的来回传递, 比如, 作为react组件的属性.

代码

首先初始化record:

  • 切换行号显示
       1 this.ds = createDeepstream('localhost:6020'); // 最高层级 datastore
       2 ....
       3 this.client = this.ds.login(
       4           {
       5             type: 'webhook',
       6             email: '[email protected]',
       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           })

你可能感兴趣的:(Deepstream 实时数据store)