【问题标题】:Run a method asynchronous on the server在服务器上异步运行方法
【发布时间】:2015-06-11 05:00:24
【问题描述】:

我有一个 Meteor 服务器方法,它执行我想在后台运行的功能。我希望服务器方法在函数在不同进程中运行时继续运行。

方法:

myMethod: function(arg) { 
   _event.emit("myEvent",args);
   ...do some other stuff
}

我希望服务器做其他事情并返回给客户端,并在后台做 _event.emit 中的事情,不需要将结果发送回客户端。

它目前所做的是运行 _event.emit 中的内容,然后再返回给客户端。

我试图通过在服务器端调用一个空的回调函数来解决这个问题,但这并没有解决问题

myMethod: function (arg) {
   return Meteor.call("secondMethod", _.toArray(arg), function() {})
}
secondMethod: function (arg) {
   _event.emit("myEvent",args);
}

希望有人知道这个问题的解决方案。 谢谢

【问题讨论】:

    标签: node.js asynchronous methods meteor


    【解决方案1】:

    nodejs 中的 javascript 是单线程的。它在一个事件队列中工作,其中一个事件从队列中弹出,调用一些回调来服务该事件,并且该回调背后的代码运行到完成,然后将下一个事件从事件队列中拉出并重复该过程。

    因此,没有真正的“后台处理”。如果您的 JS 线程正在执行,那么在该 JS 线程完成并允许处理事件队列中的下一个事件之前,其他任何东西都无法运行。

    要真正并行运行其他任务,让您的任务和其他 nodejs 代码可以同时运行,您必须创建一个新进程并让新进程执行您的任务。这个新进程可以是任何类型的进程(一些运行任务的预构建程序或另一个自定义 nodejs 进程)。

    有时可以通过对“后台”进程工作进行时间切片来模拟“在后台运行”,这样它就可以在计时器滴答声上做少量工作,并且计时器滴答声之间的暂停允许处理其他 nodejs JS 事件及其代码跑步。但是,要进行这种类型的模拟“背景”,您必须编写任务以小块执行。这是一种不同的(而且通常更麻烦)的代码编写方式。

    【讨论】:

      【解决方案2】:

      在服务器上,您可以使用Meteor.setTimeout() 异步运行函数。如果您想立即返回控制权,只需使用零间隔。您的主函数将继续运行,一旦事件队列中没有任何内容,计划任务就会运行(或者如果非零,它将等待您指定的时间)。

      【讨论】:

      • 执行Meteor.setTimeout() 非常适合异步调用Email.send() 等同步函数。现在它不再阻止我的帐户创建过程和其他时候我想关闭电子邮件。
      猜你喜欢
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      相关资源
      最近更新 更多