ben*_*nto 33 javascript stubs node.js meteor
使用Meteor,我试图了解何时使用服务器端,Meteor.methods()同时仍保留即时UI更新.
从Andrew Scala的介绍性教程中,他声称Meteor.methods()应该在您想要更新和修改数据库文档时使用:
我们的想法是,您定义服务器上执行修改和更新数据等危险内容的所有功能,然后让客户端调用这些函数并获取常规函数等返回值.客户端永远不会看到实现,也不会亲自修改数据.服务器完成所有工作.
遵循这个建议,我在我的代码中实现了这个:
服务器端:
Meteor.methods({
addMovie: function(data) {
var movie = Movies.insert({name: data});
return movie;
},
...
Run Code Online (Sandbox Code Playgroud)
客户端:
Template.movies.events = ({
'click #add-movie': function(e) {
var name = document.getElementById('movie-name').value;
Meteor.call('addMovie', name);
return false;
},
...
Run Code Online (Sandbox Code Playgroud)
这有效,但速度很慢.UI不会像Movies.insert()在客户端调用时那样立即更新.该文件表明,以纠正问题,您可以创建在客户端存根:
客户端上的调用方法定义与同名服务器方法关联的存根函数.如果您不希望,则不必为方法定义存根.在这种情况下,方法调用就像其他系统中的远程过程调用一样,您必须等待服务器的结果.
但这些存根应该是什么样的?它应该与服务器端方法基本相同吗?如果是这样,重点是什么?我正在寻找关于Meteor.methods()存根的使用和目的,点/使用及其实现的更全面的解释.
编辑:大卫格林斯潘已帮助阐明Meteor.methods()和存根在流星谈话中的使用.
Llo*_*oyd 19
这是另一个例子.
假设您正在编写一个宾果游戏并且您点击按钮来调用"house!"..在点击事件中您可以称之为方法,例如
Method.call("callHouse");
Run Code Online (Sandbox Code Playgroud)
这将调用服务器方法:
// on the server
Meteor.methods({
callHouse: function () {
if (currentGame.isInProgress) {
currentGame.winner = this.userId;
currentGame.end();
}
}
});
Run Code Online (Sandbox Code Playgroud)
如果你是第一个打电话给"房子",这个方法会把你标记为赢家..但是,让我们假装这个方法非常慢,而你的客户端应用程序正在等待......你99%肯定服务器会确认你是获胜者 - 您只想在没有等待的情况下更新用户的屏幕..在这种情况下实现客户端存根:
// on the client
Meteor.methods({
callHouse: function () {
currentGame.winner = Meteor.userId();
// add any other side-effects you expect to occur here
}
});
Run Code Online (Sandbox Code Playgroud)
当服务器结果返回时,如果返回的数据与您在存根中设置的数据不同,它将更正它并相应地刷新屏幕.
jay*_*jay 12
简而言之 :
在推送到服务器的文件中定义一些方法(Meteor.methods),这些方法将在服务器上进行实际工作,在推送到客户端的文件中定义一些方法(Meteor.methods)以在客户端上获得"即时"行为(例如加载指示符),直到服务器将结果更改推送回客户端
这是David的原帖:
你好,
原则上,方法可以在客户端和服务器上执行完全不同的动作,例如在客户端上显示加载指示符并与服务器上的远程API通信.在客户端上调用Meteor.methods定义客户端行为,并在服务器上调用Meteor.methods定义服务器行为.
对于在数据库上运行的方法,通常相同的实现将对两者都有效.客户端版本影响客户端数据库(订阅的文档的浏览器端"缓存"),服务器端版本影响真实数据库.当客户端听到回来时,它会"捕捉"到服务器端突变的结果; 客户端数据库突变被丢弃(或撤消,取决于您如何看待它).如果客户端方法调用其他方法,则这些辅助调用不会远程连接到服务器.服务器端版本将在服务器上调用相同的方法,或者不调用它.
因此,您提供的任何客户端方法只是一个"模拟",并不一定准确(可能无法).希望您通常免费获得模拟impl,因为它与服务器impl相同!
这回答了你的问题了吗?
- 大卫