流星同步方法调用

时间:2017-07-14 09:33:21

标签: meteor

关于方法的流星文档说:

  

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

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

E.g。如果我从流星应用程序调用流星应用程序进行服务器到服务器的DDP方法调用:

const data = anotherMeteorApp.call(...)

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

1 个答案:

答案 0 :(得分:0)

是的!上面的代码同步运行(如果没有提到回调。),这将减慢操作直到操作完成。您可以通过在服务器上的流星调用中暂停进程来检查添加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;