Node.js NodeJS执行上下文

Node.js NodeJS执行上下文,node.js,Node.js,我在试着理解一些小问题。 下面的逻辑假设是,当readdir完成时,它将设置标志以便while循环停止。很明显,它不是这样工作的。据我所知,这更像是一件大事,但我想做的并不重要,我更感兴趣的是它是如何工作的以及为什么。是因为while循环阻塞(?) node.js中的Javascript在事件循环的单个线程中执行,因此在while循环完成之前,无法执行异步回调。它是这样工作的: drim函数注册一个匿名回调(函数(err,data)),稍后执行(可能在完成时执行)。它还计划自己的异步操作(告诉解

我在试着理解一些小问题。 下面的逻辑假设是,当readdir完成时,它将设置标志以便while循环停止。很明显,它不是这样工作的。据我所知,这更像是一件大事,但我想做的并不重要,我更感兴趣的是它是如何工作的以及为什么。是因为while循环阻塞(?)


node.js中的Javascript在事件循环的单个线程中执行,因此在while循环完成之前,无法执行异步回调。

它是这样工作的:

  • drim
    函数注册一个匿名回调(
    函数(err,data)
    ),稍后执行(可能在完成时执行)。它还计划自己的异步操作(告诉解释器它需要drim一些东西)

  • 运行while循环

  • 解释器正在等待脚本的结尾,以查看是否还有其他事情要做(drim某事,以及在稍后完成时运行计划的回调)

  • 。。。没有数字4,因为while循环永远不会完成,因此永远不会到达脚本的结尾,因此解释器没有机会自己运行任何东西

  • 在大多数其他语言(如C或Python)中,异步库要求您执行自己的函数来运行eventloop。大概是这样的:

    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);