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

时间:2012-03-05 05:51:20

标签: javascript node.js

:声明:

请注意,我正在尝试使用node.js来实现某些可能违反其设计原则的内容。然而,由于node.js违反了“javascript是客户端”的规范,我也在尝试不同的东西。请多多包涵。

:背景:

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

我理解node.js的事件驱动方法,并且有一个基于异步回调的解决方案。现在我正在尝试简化这个以满足我们更基本的脚本编写要求。

:问题:。

是否有办法运行脚本(使用自己的沙箱),在执行结果时可以暂停执行。

E.g。

var util = require('util'),
vm = require('vm'),
user = require('user');

vm.runInThisContext('user.WaitForProceed(); console.log('Waiting over');');

console.log('Finished!');

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

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

  • Ĵ

3 个答案:

答案 0 :(得分:8)

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

有一些库支持高级流控制,比如Invoke,也许这可能会有所帮助,但我知道,这不是你要求的:)

您还可以使用nextTick()

实现忙循环

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

最后一种方法是readFileSync()到一个关闭certian事件的namedpipe。

正如您已经提到的那样,这是违反语言原则的,因此这些解决方案都很苛刻。

答案 1 :(得分:7)

如果你真的想睡眠节点进程的执行,你可以。但是,正如您所说,您似乎完全了解其含义。

这是一个NPM模块: https://github.com/ErikDubbelboer/node-sleep

您可以像这样使用它:

var sleep = require('sleep');
sleep.sleep(1); //sleep for 1 sec
sleep.usleep(2000000); //sleep for 2 sec

我为 通过Google搜索到达的未来访问者 部分写了这个:你不应该使用上述技术。如果你决定你必须要注意,这将阻止您的节点进程,并且在睡眠期结束之前它将无法执行任何其他工作。此外,您将违反任何意识到它是Node.js程序的用户的期望,因为Node.js程序被认为是非阻塞的。

祝你好运。

答案 2 :(得分:2)

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

此外,您需要将您的呼叫包裹在光纤(线程)中,以免阻止事件循环。

var Sync = require('sync');

var someAsyncFunction = function(a, b, callback) {
    setTimeout(function() {
        var result = a + b;
        callback(undefined, result);
    }, 1000);
};

// Run in a fiber
Sync(function(){
    // This code runs in separate fiber and does not block the event loop

    // First argument is 'this' context
    var result = someAsyncFunction.sync(null, 2, 3);
    // Waiting one second
    console.log(result); // Will output 5
});

// Event loop here

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