例如,我想做的类似事情:
var http = require('http');
const PORT=8080;
var myvar = "Test: ";
function handleRequest(request, response){
response.end(myvar);
}
var server = http.createServer(handleRequest);
server.listen(PORT, function(){
console.log("Server listening on: http://localhost:%s", PORT);
});
var asdf = 0;
while(true){
asdf += 1;
myvar += asdf;
}
var asdf上面的代码可以工作,但是当我放入while循环时它不会,因为它没有时间让服务器工作。
但我不知道该怎么做。我一直在寻找答案,但人们说像停止while循环并处理请求然后继续循环,但我不想停止循环。我认为没有实现一些线程可能是可能的,但首先我想听听一些关于它的意见,因为我是node.js的新手并且我没想象实现锁等等。
答案 0 :(得分:3)
node.js中的Javascript是单线程和事件驱动的。传入的事件只能在当前的Javascript执行完成并返回系统时得到处理。
因此,你不能只使用while循环永远循环某些东西,因为服务器中没有其他Javascript可以运行。没有事件可以被处理,这对于应该及时处理传入请求的服务器来说是死亡。
Node.js是一个事件驱动的系统。必须通过事件(定时器,网络回调,其他异步回调等)安排活动。任何长时间运行的循环都会阻止整个服务器执行任何其他操作。
如果您想定期检查某个引脚的状态而您的底层硬件驱动程序没有提供事件驱动的界面,那么您可能希望使用setInterval()
或setTimeout()
来“轮询”硬件的状态。只要确保你没有使轮询之间的时间间隔太短,以至于你没有花太多时间让服务器做其他事情。
// poll the pin state
setInterval(function() {
let pinState = getPin();
if (pinState === someValue) {
// do something
}
}, 100);
作为一个例子,我有一个运行node.js的Raspberry Pi作为阁楼风扇控制器。它有两个温度探头(一个用于外部空气温度,一个用于阁楼空气温度)。它每隔10秒使用setInterval()
来检查这两个温度值,并决定是否应该打开或关闭阁楼风扇。
理想情况下,您可以避免在node.js中对计时器进行轮询,因为它效率低下。您宁愿拥有一个底层驱动程序,它允许您为引脚状态或硬件设备的某些重大更改注册回调。但是,有时你的司机不这样做,所以你必须重新进行老式的“民意调查”。
答案 1 :(得分:1)
如果您只想连续处理数据,可以使用setInterval
功能,该功能将连续调用间隔较小的函数。这将使您的其余代码有时间运行。
// synchronous code, with a while loop
while(true) {
// do something
}
// NOTE: anything after this never runs
// asynchronous code, with setInterval
setInterval(function() {
// do something
}, 10);
10
这是每次运行代码之间的毫秒数。对于大多数用途(例如连续读取引脚),少量(例如10毫秒或每秒100次)应该可以正常工作。
答案 2 :(得分:0)
我不确定,但您可以尝试通过http
或restler
节点模块向您自己的节点服务器发送请求。
function recursive() {
http.request(url, function(err, res) {
recursive();
})
}
https://nodejs.org/api/http.html#http_http_request_options_callback
当你想开始递归时调用这个方法。