Meteor开发平台入门 互动版

数据发布/订阅 - Pub/Sub

发布/订阅模型是解决数据跟踪问题的一个有力武器,开发者避免了通过定期地轮询 来获取最新的数据。Meteor的DDP实现包含了Pub/Sub协议的实现。

≡ 服务端 —— 发布数据集

在服务端,通过调用Meteor.publish(name,func)方法来发布一个数据集/RecordSet

参数name声明数据集的名称,在客户端进行订阅时,需要使用相同的名称; 参数func是一个订阅初始化函数,每个客户端的订阅操作将相应在服务端将调用这个函数。

func函数体内,this指向发布句柄/Publish Handle对象,需要使用这个对象 的以下方面在数据集发生变化时通知客户端:

  • added(c,id,data) - 通知客户端向名称为c集合中插入编号为id的新数据data
  • changed(c,id,data) - 通知客户端使用data更新名称为c集合中指定id的数据记录
  • removed(c,id) - 通知客户端删除名称为c集合中指定id的数据记录。

下面的代码发布了一个名为messages的数据集,初始为空,每隔两秒钟模拟一条新的消息:

//server side
Meteor.publish("messages",function(){
  //保存发布句柄对象
  var self = this;
  //设置记录id初始值
  var id = 0;
  //向客户端声明数据集就绪 - 目前这是一个空数据集
  self.ready();
  //每隔2秒钟模拟一条新的消息
  setInterval(function(){
    self.added("msg",++id,{text:'fake message ' + id});
  },2000)
})

≡ 客户端 —— 订阅数据集

客户端调用Meteor.subscribe(name,[arg1,arg2...])方法订阅服务端发布的数据集, 参数name就是服务端进行发布时定义的数据集名称。

客户端进行订阅后,服务端会自动将数据的变化发送过来。这些数据变化,客户端存储在本地 的同名集合/collection中。比如对于上面的messages数据集,其中的一个集合/collection 名称为msg,那么客户端需要定义一个同名的本地集合/collection

var localMsg = new Mongo.Collection("msg",{connection:null});
Meteor.subscribe("messages");

如果进行订阅的时候,本地集合还不存在,那么Meteor会自动将数据变化保存下来,并在 本地集合就绪时提交。这意味着先进行订阅,再定义本地集合也是可行的:

Meteor.subscribe("messages");
var localMsg = new Mongo.Collection("msg",{connection:null});

执行以下命令复位test应用、删除源文件:

~/test$ meteor reset↵
~/test$ rm -rf \*↵

执行以下命令拷贝pubsub示例代码,运行并查看运行结果:

~/test$ cp ~/demos/pubsub/* .↵
~/test$ meteor↵

理解并修改pubsub示例代码,通过练习掌握在Meteor应用中,服务端发布数据集的方法, 以及在客户端订阅、显示数据集的方法

```