Node.js NodeJS执行上下文
我在试着理解一些小问题。 下面的逻辑假设是,当readdir完成时,它将设置标志以便while循环停止。很明显,它不是这样工作的。据我所知,这更像是一件大事,但我想做的并不重要,我更感兴趣的是它是如何工作的以及为什么。是因为while循环阻塞(?)Node.js NodeJS执行上下文,node.js,Node.js,我在试着理解一些小问题。 下面的逻辑假设是,当readdir完成时,它将设置标志以便while循环停止。很明显,它不是这样工作的。据我所知,这更像是一件大事,但我想做的并不重要,我更感兴趣的是它是如何工作的以及为什么。是因为while循环阻塞(?) node.js中的Javascript在事件循环的单个线程中执行,因此在while循环完成之前,无法执行异步回调。它是这样工作的: drim函数注册一个匿名回调(函数(err,data)),稍后执行(可能在完成时执行)。它还计划自己的异步操作(告诉解
node.js中的Javascript在事件循环的单个线程中执行,因此在while循环完成之前,无法执行异步回调。它是这样工作的:
drim
函数注册一个匿名回调(函数(err,data)
),稍后执行(可能在完成时执行)。它还计划自己的异步操作(告诉解释器它需要drim一些东西)async_function(callback);
eventloop.run(); // this allows the async function to work
在这些语言中,很明显,为什么在运行eventloop之前插入while循环意味着eventloop永远不会运行:
async_function(callback);
while (1) { /* do nothing */ }
eventloop.run(); // never gets run
在javascript中,eventloop不是libaray,而是内置的。因此,eventloop.run
在脚本末尾以静默方式执行:
async_function(callback);
// eventloop runs here
补充答复 要在
循环(等待设置标志)异步工作时获取的语义,您始终可以将其替换为setInterval
或setTimeout
循环:
setInterval(function(){
if (flag == false) {
console.log('Hey');
}
},10); // check 100 times per second
要停止setInterval
,只需调用clearInterval
:
var loop = setInterval(function(){
if (flag == false) {
console.log('Hey');
}
else {
clearInterval(loop); // stop the loop
}
},10);
我在想电话会被打断。感谢您的详细解释。如果您熟悉C编程,eventloop中实际发生的是围绕select()
或epoll()
的循环,这会使进程进入睡眠状态,操作系统会因I/O事件或超时而将其唤醒。谢谢。这就是我正在寻找的函数r(){if(!flag){console.log(“Hey”);setImmediate(r);}}
你总是可以用异步setInterval
循环替换同步而
循环来做你想做的事情。太糟糕了,我只能选择一个答案。干杯
var loop = setInterval(function(){
if (flag == false) {
console.log('Hey');
}
else {
clearInterval(loop); // stop the loop
}
},10);