:声明:
请注意,我正在尝试使用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行。
此示例的输出不重要,因为它也可以通过回调实现。对于此解决方案,示例脚本的叙述性质更为重要。
答案 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
请小心。您需要了解这不是节点方式。