【问题标题】:Calling a Synchronous function in Meteor.js在 Meteor.js 中调用同步函数
【发布时间】:2014-02-05 14:12:29
【问题描述】:

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

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

也就是说,如果回调需要 10 秒才能返回,这是否意味着服务器在 10 秒内不能做任何其他事情?

【问题讨论】:

  • 我不认为Meteor._wrapAsync 将异步函数转换为同步函数,因为我认为这实际上是不可能的。
  • @MattBall 这正是_wrapAsync 所做的,它通常使用回调的第一个和第二个参数(错误,结果)来抛出错误或使用光纤产生

标签: javascript node.js meteor node-fibers


【解决方案1】:

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

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

【讨论】:

  • 如果代码在cursor.observe()类似added的回调函数中,会不会有不同的处理方式?
  • 我想是的,你在哪里运行观察者是在 Meteor.startup 中吗? (与服务器一起运行 - 但不附属于客户端)。如果你想强制它在光纤中运行,你可以将它包装在 Fiber(function() { ... }).run()
  • 我在 Meteor.startup 之外运行观察者,appPath/server/server.js。它不与任何客户端关联。在 Meteor.startup 中运行会更好吗?我想避免阻塞整个服务器
  • 哦,那里应该没问题,因为它会在单独的光纤中。它不应该阻止您的客户,某些情况取决于您的代码,但它看起来不像。最好将它放在 Meteor.startup 中,因为您可以确保此时流星已完全加载。
  • 谢谢,我会把它放在 Meteor.startup 中。 Meteor._wrapAsync 是否将回调放在单独的光纤中?我似乎找不到 _wrapAsync 的文档
猜你喜欢
  • 2012-07-25
  • 2020-12-20
  • 1970-01-01
  • 2013-07-12
  • 2015-03-19
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多