NodeJS执行上下文

时间:2014-05-21 23:13:14

标签: node.js

我想了解一点NodeJS。 下面的逻辑应该是,当readdir完成时,它将设置标志,以便while循环停止。显然它不会这样工作。据我所知,这更像是一件事情,但我想做的事情并不重要,我对它的工作方式和原因更感兴趣。是因为while循环阻塞(?)?

var dirm = require('./dirm.js');
var flag = false;
dirm(process.argv[2], process.argv[3], function(err, data) {
    flag = true;
    if (err)
        console.log(err);
    data.forEach(function(file) {
        console.log(file);
    })
})
while (flag == false) {
    console.log('Hey');
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

它的工作原理如下:

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

  2. 您运行while循环

  3. 解释器正在等待脚本结束以查看是否还有其他事情要做(稍微干一点,以及何时在稍后的时间运行预定的回调)。

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

  5. 在大多数其他语言(如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
    

    附加答案

    要获取while循环的语义(等待设置标志)异步工作,您始终可以用setIntervalsetTimeout循环替换它:

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