Javascript 如何在客户端收集钩子中使用服务器方法的结果?
我正在尝试使用matb33:collection钩子设置一些服务器端和客户端before.insert和before.update钩子,我需要使用服务器端方法的结果来增强文档 由于客户机上缺少某些库,因此我无法在客户机上完全执行此操作 我不能完全在服务器上完成这项工作,因为我需要立即得到结果,如果没有结果,UI会闪烁和跳跃太多 问题是,服务器端方法在客户机上被异步调用,因此我没有定义 是否有一种干净的方法来运行阻塞函数,我可以在客户端before.insert/before.update钩子中使用它来从服务器获得一些结果 编辑: 在继续使用客户端存根之前,我必须访问服务器端函数(或方法)的结果。因此,我的问题归结为: 如何在等待服务器端函数结果的客户端上创建阻塞函数Javascript 如何在客户端收集钩子中使用服务器方法的结果?,javascript,asynchronous,meteor,Javascript,Asynchronous,Meteor,我正在尝试使用matb33:collection钩子设置一些服务器端和客户端before.insert和before.update钩子,我需要使用服务器端方法的结果来增强文档 由于客户机上缺少某些库,因此我无法在客户机上完全执行此操作 我不能完全在服务器上完成这项工作,因为我需要立即得到结果,如果没有结果,UI会闪烁和跳跃太多 问题是,服务器端方法在客户机上被异步调用,因此我没有定义 是否有一种干净的方法来运行阻塞函数,我可以在客户端before.insert/before.update钩子中使
我无法在客户端上模拟或模拟临时值。我不需要/想要延迟补偿。阻塞是我所需要和想要的。使用与客户端相同的功能,但是向集合对象添加标记,例如
readyForServer:false
。客户端对对象执行所需操作后,设置readyForServer:true
,然后观察服务器上的更改,特别查找该readyForServer===true
属性。下面是服务器代码的外观示例。我假设您已经有了一个工作的客户端钩子:
// Watch For File Additions
Files.find().observeChanges({
added : function (id, fields) {
// Don't want to watch added
},
changed : function (id, fields) {
if (fields.readerForServer) {
// Complete server side actions
}
}
});
你可以用一个存根。由于服务器存在延迟,如果要避免闪烁,可以在服务器等待结果时临时添加“虚拟”字段 您所需要做的就是为客户端的
Meteor.call
创建一个匹配方法。此方法将在模拟模式下运行,仅用于UI
//客户端
Meteor.call("insert_my_doc", { value: '2'});
Meteor.methods({
insert_my_doc: function(doc) {
doc.added_value = 'this is an added value';
MyCollectionWithHooks.insert(doc);
}
});
//服务器端
Meteor.methods({
insert_my_doc: function(doc) {
MyCollectionWithHooks.insert(doc);
}
});
MyCollection.before.insert(function(doc) {
doc.added_value = 'something';
});
这里的附加值是“2”而不是“0”,然后将其自身更正为“某物”。当然,你可以做其他任何事情
如果您对文档所做的更改更具体一些,我可以根据您的需要修改一下答案。但这将是类似这样的事情,因为您必须让客户端上的某些东西在服务器响应时提供一个虚假的临时值(不会立即响应)
关于你的最后一个问题,如果没有ES6功能(这些功能还没有完全发布,在每个浏览器上都不可用),运行阻塞方法是不可能的
如果您觉得这可以满足您的需要,您可以使用生成器来实现这一点:我的要求是针对我正在开发的包,它需要在客户机上透明,不需要修改代码,并且应该是选择性的。服务器上这样的monkeypatch模式需要dev或包代码来设置观察器,而不考虑这一点。不过还是要感谢你的想法。谢谢,但我确实需要客户端上的服务器结果,然后才能继续创建文档。这不是一个结果,我可以替代或嘲笑客户。在继续插入之前,我必须等待该结果,即使它位于存根中。@serkandurousy您必须期待一些UI模拟。使用阻塞解决方案,如果您决定使用生成器,基本上会冻结UI,这有点糟糕。也许你可以在方法等待完成时放入一个加载屏幕?我可以使用一个阻塞UI。事实上,正如我所解释的,这正是我想要的。@Serkandurousoy我已经为这个案例提供了一些您可以做的事情,您可以使用生成器。恐怕浏览器需要启用ES6。由于客户端javascript的限制,没有办法解决这个问题。谢谢Akshat,我的直觉告诉我同样的情况,不幸的是我还不熟悉ES6的概念。如果您可以用一个对服务器端meteor方法进行“阻塞异步”调用的基本示例来编辑您的答案,那么为了将来的参考,我将继续将这个标记为已接受的答案。