Javascript Node.js-暂停另一个线程中的脚本执行

Javascript Node.js-暂停另一个线程中的脚本执行,javascript,node.js,Javascript,Node.js,:免责声明: 请注意,我试图通过node.js实现一些可能违背其设计原则的东西。然而,由于node.js违背了“javascript用于客户端”的规范,我在这里也尝试了一些不同的东西。请容忍我 :背景: 我有一个要求,Java脚本需要是叙述性的(从头到尾阅读),以便为简单化的用户编写简单化的脚本。我还将为更高级的用户提供异步脚本功能 我了解node.js的事件驱动方法,并且有一个基于异步回调的解决方案。现在,为了满足更基本的脚本编写需求,我尝试将其简化 :问题: 是否有一种方法可以运行脚本(使用

:免责声明:

请注意,我试图通过node.js实现一些可能违背其设计原则的东西。然而,由于node.js违背了“javascript用于客户端”的规范,我在这里也尝试了一些不同的东西。请容忍我

:背景:

我有一个要求,Java脚本需要是叙述性的(从头到尾阅读),以便为简单化的用户编写简单化的脚本。我还将为更高级的用户提供异步脚本功能

我了解node.js的事件驱动方法,并且有一个基于异步回调的解决方案。现在,为了满足更基本的脚本编写需求,我尝试将其简化

:问题:

是否有一种方法可以运行脚本(使用自己的沙盒),在交付结果时可以暂停执行

例如

用户是我自己的模块,将执行等待。基本上,我希望它坐在那里,在vm对象中阻塞该行,直到它收到返回的结果。之后,它将继续进入console.log行

这个例子的输出并不重要,因为它也可以通过回调实现。对于此解决方案,示例脚本的叙述性质更为重要

  • J

    • 无法在节点中暂停执行。至少他们告诉我们:)

      有些库支持高级流控制,比如,也许这会有所帮助,但我理解,这不是您所要求的:)

      您还可以使用

      或者可以在C++中实现一个阻塞调用,并将其作为库提供。我从来没有这样做过

      最后一种方法是创建一个命名管道,该管道在某个事件发生时关闭


      正如您已经提到的,这违反了语言原则,因此这些解决方案都是有漏洞的。

      如果您确实想在等待结果时暂停执行,您可以尝试使用。它建立在。您的应用程序需要使用节点脚本而不是节点来执行。节点同步将同步方法添加到Function.prototype,该方法允许同步运行它

      此外,您还需要将呼叫封装在光纤(线程)中,以免阻塞事件循环

      var Sync=require('Sync');
      var someAsyncFunction=函数(a、b、回调){
      setTimeout(函数(){
      var结果=a+b;
      回调(未定义,结果);
      }, 1000);
      };
      //在光纤中运行
      同步(函数(){
      //此代码在单独的光纤中运行,不会阻止事件循环
      //第一个参数是“this”上下文
      var result=someAsyncFunction.sync(null,2,3);
      //等一秒钟
      console.log(结果);//将输出5
      });
      //这里的事件循环
      

      请小心点。您需要了解这不是节点方式。

      如果您确实想休眠节点进程的执行,您可以。然而,正如你所说,你似乎完全意识到了其中的含义

      以下是一个NPM模块来完成此操作:

      您可以这样使用它:

      var sleep = require('sleep');
      sleep.sleep(1); //sleep for 1 sec
      sleep.usleep(2000000); //sleep for 2 sec
      
      我写这篇文章的部分目的是为了未来通过谷歌搜索到达的访问者:你不应该使用上述技术。如果你决定必须这样做,请注意这将阻止你的节点进程,在睡眠期结束之前,它将无法进行任何额外的工作。此外,您将违反任何知道它是Node.js程序的用户的所有期望,因为Node.js程序被认为是非阻塞的


      祝你好运。

      那么是谁宣称这个所谓的规范(!?)“javascript是客户端的”-还是你(和其他人)只在那里见过它,并且宣称你/他们知道的唯一东西必须是“规范”?无论如何,没有,没有办法停下来。JS机器继续运行事件循环,只有在没有任何东西要运行时才会停止。因此,停止的唯一方法是不再有代码和事件(附带事件侦听器)。你唯一能做的就是等待“继续”事件……所以你必须有一个事件要监听,由你的“用户”对象触发。但是你说你已经有了这样一个解决方案,所以你要从中吸取的重要一点是JS引擎本身是如何工作的,然后你会对这些东西有更好的感觉:)你应该告诉我们更多关于user.WaitForProcceed()的功能;)“…因此,对于您来说,重要的是JS引擎本身是如何工作的…”规范是其他人告诉我事情“应该工作”的方式。我理解node的局限性和功能性,但与所有开发人员一样,我与不了解node的人打交道。然而,他们希望以自己的方式使用这个系统。我只是简单地探索一下什么是可能的。把“user.waitforprocedure();”想象成一个拦截器,它会阻止代码在将来运行,直到被要求再次唤醒。像@jp richardson示例一样,这将阻止主消息循环。这就是我想要避免的。有。正在使用本机Node.js加载项。。。看看我的答案。非常好的小技巧,非常有效。我无法在Windows上获取命名管道,因此我使用了一个普通文件,并安排在我想要恢复执行时将字符串“EOF”写入其中,然后不断调用readSync,直到字符串出现。别评判我,很好。遗憾的是,我需要主脚本在sync函数调用时停止执行,然后在稍后的日期被要求重新开始。这对我需要实现的其他目标也很有效。也许我可以用它作为虚拟机的运行器,并暂停该光纤。如果你需要在函数工作时停止执行主事件循环,只需删除Sync(function(){});来自示例的包装器。这将暂停主事件循环。谢谢!我想知道,如果您将vm分叉,这是否仍然会暂停主消息循环。问题仍然是,我需要其他东西来唤醒分叉过程。也许纤维(如下所述)会有一个好的结果。嗯,埃里克的
      var sleep = require('sleep');
      sleep.sleep(1); //sleep for 1 sec
      sleep.usleep(2000000); //sleep for 2 sec