2017-07-14 63 views
1

有关方法的流星文档说:流星同步方法调用

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

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

E.g.如果我做一个服务器到服务器的DDP方法调用流星应用从应用流星:

const data = anotherMeteorApp.call(...) 

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

回答

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; 
+0

谢谢!它是否仅阻挡被称为光纤的地方? –

+0

是的!它会阻挡光纤。 –