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(目前,在我看来),主要作用有两个(对于前端):
- 修改集合,获得延迟补偿效果
- 异步地查询