Meteor 同步方法调用

Posted

技术标签:

【中文标题】Meteor 同步方法调用【英文标题】:Meteor synchronous method calls 【发布时间】:2017-07-14 09:33:21 【问题描述】:

有关方法的 Meteor 文档说:

在服务器端,这个函数可以同步或异步运行。如果省略回调,它将同步运行,并在请求成功完成后返回结果。如果请求不成功,则会引发错误。这在从 Meteor 方法中进行服务器到服务器 HTTP API 调用时很有用,因为该方法可以根据同步 HTTP 调用的结果成功或失败。在这种情况下,请考虑使用 this.unblock() 以允许同一连接上的其他方法同时运行。在客户端,这个函数必须通过回调来异步使用。

但我发现它非常模棱两可且不明显,它只是看起来同步但使用光纤运行异步,还是真的变得同步?

例如如果我从流星应用程序对流星应用程序进行服务器到服务器 DDP 方法调用:

const data = anotherMeteorApp.call(...)

上面的代码是否运行同步、阻塞事件循环并减慢速度?如果它在一个方法中,是否会在该代码行之前添加this.unblock() 使其异步?如果它不在一个方法中(例如,如果它在一个 collection2 钩子中),它会阻塞吗?

【问题讨论】:

【参考方案1】:

是的!上面的代码同步运行(如果没有提到回调),这会减慢速度直到操作完成。您可以自己通过在服务器上的流星调用中休眠进程来检查添加this.unblock() 的影响。

您可以使用下面的代码来创建一个过程模拟,该过程需要太多时间来执行并从服务器上定义的方法返回 (Meteor.method())。

var breakTime = 20000; // 20 secs
var Future = Npm.require('fibers/future');
var fut = new Future();

var pause = new Promise(function(resolve, reject) 
  setTimeout(() => resolve(1), breakTime);
);
pause.then((1) => 
   fut.return(true);
);
let waitHere = fut.wait();
return true;

【讨论】:

谢谢!它是否只阻塞调用它的光纤? 是的!它会阻止纤维。

以上是关于Meteor 同步方法调用的主要内容,如果未能解决你的问题,请参考以下文章

在 Apollo Mutation 中调用 Meteor 方法

如何从 Meteor 中的服务器调用客户端方法?

Meteor 客户端在服务器方法中调用 findOne

正确使用 Meteor.userId()

Meteor 中的安全方法

Meteor 中的安全方法