Meteor methods: client? server?

  Meteor提供methods,使得前端可以直接调用后端定义的方法(methods),就像调用本地方法一样。

  虽然像调用本地方法,但是毕竟还是远程调用,和调用本地方法毕竟有些不同,当然也包括语法(Meteor.call)

  methods可以写在server,或同时写在server和client,无论如何,前后端都可以调用,并且具有以下特点:后端调用时,method的返回值同步地返回,而前端调用时,则是异步地返回(需要提供callback),这影响到一些设计,比如helper,helper要同步地返回值,所以不适合直接调用method

  当methods同时写在server和client的时候,client的版本叫做stub,也就是说,这个方法在后端会执行,但是,前端也会执行,后端执行其server版本,而前端,则执行其client版本(但callback只接受一次来自后端的返回值,因此,不能从前端版本的method返回值,只能执行过程)

  这个设计有什么作用呢?典型用例是这样的,methods定义在公共的目录,也就是说,server版本和client版本的代码,是一样的。而这份代码,通常是对collection的操作。我们知道,对某一collection,前端订阅的是后端发布的collection的一个子集,也就是说,前端拥有一个该collection的子集的副本。当前后端执行同一份method代码,也就对某collection的前端副本和后端实体同时进行了修改,这样,在后端执行结果返回前,前端就有产生了效果(只是模拟、预测后端执行,并不可靠),当后端method执行完毕后,由于pub/sub的同步性,前端collection会被纠正,当然,理想的情况是前端正确预测了后端行为,所以不会有效果的改变,这就是所谓的延迟补偿。

  综上,methods(目前,在我看来),主要作用有两个(对于前端):

  1. 修改集合,获得延迟补偿效果
  2. 异步地查询
  前面提到,使用method异步地查询,对helper帮助不大,因为helper只能同步地返回值。解决这个问题,首先要理解helper:helper的主要目的,是帮助模板从本地数据中同步出值。可见,helper可以方便地从session、collection之类的本地容器同步值,因此,可以使用method进行异步查询,然后在回调中将结果写入helper观察的本地容器。但是,不同于修改collection可以自动更新,method对依赖的数据毫无知觉,比如说,posts增减了,前端的posts会同步,依赖posts集合的模板也会同步,但是,如果某method返回posts.count,它却不会自动执行(这其实反应了Meteor的架构),因此,如果某helper依赖某method的返回值(通过session或collection中介),那么它并不会实时更新,这个更新触发机制,就需要我们自己来实现了(定时刷新,还是事件触发?自己考虑了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值