如何在客户端集合钩子中使用服务器方法的结果?

时间:2015-05-01 12:41:25

标签: javascript asynchronous meteor

我正在尝试使用matb33:collection-hooks在before.insert和before.update挂钩之前设置一些服务器和客户端,我需要使用服务器端方法的结果来增强文档。

由于客户端缺少某些库,我不能完全在客户端上进行。

我不能完全在服务器上这样做,因为我需要立即得到结果,否则UI会闪烁并跳得太多。

问题是,服务器端方法在客户端上异步调用,因此未定义。

是否有一种干净的方法来运行阻塞函数,我可以在客户端使用before.insert / before.update hook来从服务器获取一些结果?

编辑: 在继续使用客户端存根之前,我必须才能访问服务器端功能(或方法)的结果。因此,我的问题归结为:

如何在等待服务器端功能结果的客户端上创建阻塞功能。

我不能在客户端上模拟或模拟临时值。我不需要/想要延迟补偿。阻止是我需要和想要的。

2 个答案:

答案 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