Javascript 在Meteor.js中调用同步函数

Javascript 在Meteor.js中调用同步函数,javascript,node.js,meteor,node-fibers,Javascript,Node.js,Meteor,Node Fibers,在Meteor服务器上调用同步函数时,它是否会阻止整个服务器,直到收到回调 queueTask = function(callback) { ... } queueTaskSync = Meteor._wrapAsync(queueTask) queueTaskSync(function(results) { console.log('callback returns after 10 seconds') Results.insert(results) }) 换句话说,如果回调

在Meteor服务器上调用同步函数时,它是否会阻止整个服务器,直到收到回调

queueTask = function(callback) { ... }
queueTaskSync = Meteor._wrapAsync(queueTask)
queueTaskSync(function(results) {
    console.log('callback returns after 10 seconds')
    Results.insert(results)
})

换句话说,如果回调需要10秒钟才能返回,这是否意味着服务器在10秒钟内不能执行任何其他操作?

这取决于代码的位置。如果代码位于服务器上的
Meteor.methods
中,则来自同一客户端的其他Meteor调用将被阻止,但其他调用不会被阻止,因为它们位于不同的光纤中


您可以在方法中使用
this.unblock()
绕过此操作,以确保下一个方法调用在新的光纤中运行,从而使它们更并发。

这取决于此代码所在的位置。如果代码位于服务器上的
Meteor.methods
中,则来自同一客户端的其他Meteor调用将被阻止,但其他调用不会被阻止,因为它们位于不同的光纤中


您可以在方法中使用
this.unblock()
绕过此问题,以确保下一个方法调用在新的光纤中运行,从而使它们更并发。

我不认为
Meteor.\u wrapAsync
将异步函数转换为同步函数,因为我认为这实际上是不可能的。@MattBall这正是
\u wrapAsync
所做的,它通常使用回调的第一个和第二个参数(err,result)来抛出错误或使用fibers来产生错误。我不认为
Meteor。\u wrapAsync
将异步函数转换为同步函数,因为我认为这实际上是不可能的。@MattBall这正是
\u wrapAsync
所做的,它通常使用回调的第一个和第二个参数(err,result)来抛出错误,或者使用fibers(如果代码位于
光标中)。observe()
回调函数,如
added
,它会被不同的处理吗?我想是的,你在哪里运行观测者?它在Meteor.startup中吗?(与服务器一起运行,但不附属于客户端)。如果你想强制它在光纤中运行,你可以将它封装在光纤中(function(){…})。run()我在Meteor.startup之外的
appPath/server/server.js上运行观察器。它与任何客户端都没有关联。在Meteor.startup内运行是否更好?我想避免阻塞整个服务器。哦,应该可以,因为它将位于单独的光纤中。它不应该阻止您的客户机,根据您的代码,可能会出现某些场景,但看起来不是这样。最好把它放在Meteor.startup中,因为你可以保证Meteor在那一点上已经完全加载。谢谢,我会把它放在Meteor.startup中。Meteor.\u wrapAsync
是否将回调放在单独的光纤中?如果代码位于
光标中,我似乎找不到
\u wrapAsync
的文档。observe()
回调函数,如添加的
,它会得到不同的处理吗?我想是的,您在Meteor.startup中在哪里运行观察器?(与服务器一起运行,但不附属于客户端)。如果你想强制它在光纤中运行,你可以将它封装在光纤中(function(){…})。run()我在Meteor.startup之外的
appPath/server/server.js上运行观察器。它与任何客户端都没有关联。在Meteor.startup内运行是否更好?我想避免阻塞整个服务器。哦,应该可以,因为它将位于单独的光纤中。它不应该阻止您的客户机,根据您的代码,可能会出现某些场景,但看起来不是这样。最好把它放在Meteor.startup中,因为你可以保证Meteor在那一点上已经完全加载。谢谢,我会把它放在Meteor.startup中。Meteor.\u wrapAsync
是否将回调放在单独的光纤中?我似乎找不到
\u wrapAsync