我正在尝试使用matb33:collection-hooks在before.insert和before.update挂钩之前设置一些服务器和客户端,我需要使用服务器端方法的结果来增强文档。
由于客户端缺少某些库,我不能完全在客户端上进行。
我不能完全在服务器上这样做,因为我需要立即得到结果,否则UI会闪烁并跳得太多。
问题是,服务器端方法在客户端上异步调用,因此未定义。
是否有一种干净的方法来运行阻塞函数,我可以在客户端使用before.insert / before.update hook来从服务器获取一些结果?
编辑: 在继续使用客户端存根之前,我必须才能访问服务器端功能(或方法)的结果。因此,我的问题归结为:
如何在等待服务器端功能结果的客户端上创建阻塞功能。
我不能在客户端上模拟或模拟临时值。我不需要/想要延迟补偿。阻止是我需要和想要的。
答案 0 :(得分:0)
使用与客户端使用的功能相同的功能,但是在集合对象中添加一个标记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
}
}
});
答案 1 :(得分:0)
你可以使用存根。因为服务器存在延迟,如果你想避免闪烁,你可以添加虚拟'在服务器等待的结果时暂时生成字段。
您需要做的就是为客户端的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'而不是什么,然后纠正自己的东西'。当然,你可以把它变成其他任何东西。
如果您对文档所做的更改更具体,我可以根据您的需要修改答案。但是这将是类似于这样的行,因为你必须在客户端上提供一些假的临时值,而服务器响应(这不会立即)。
对于您的上一个问题,无法以任何方式(没有ES6功能尚未完全发布且在每个浏览器上都不可用)来运行阻止方法。
如果您觉得这可以满足您的需求,可以使用生成器:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators