代码之家  ›  专栏  ›  技术社区  ›  iThirst

Node JS中的事件循环阻塞和异步编程

  •  3
  • iThirst  · 技术社区  · 8 年前

    我是Node js编程的新手,因此想非常恰当地理解核心概念和实践。AFAIK node js具有非阻塞I/O,允许所有磁盘和其他I/O操作以异步方式运行,而其js在使用事件循环管理资源和执行路径的单线程中运行。正如许多地方建议的那样,建议开发人员使用回调模式编写自定义函数/方法,例如。

    function processData(inputData, cb){
       // do some computation and other stuff
    
       if (err) {
        cb(err, null);
       }else{
        cb(null, result);
      }
    }
    callback  =  function(err, result){
    
     // check error and handle
    
     // if not error then grab result and do some stuff 
    }
    
    processData(someData, callback)
    // checking whether execution is async or not
    console.log('control reached at the end of block');
    

    若我运行这段代码,所有东西都会同步运行,最后打印控制台消息。我认为控制台消息将首先打印,然后执行 processData 函数代码,它将依次调用回调函数。如果以这种方式发生,事件循环将被解锁,并且只有在“回调”函数准备好最终响应时才会执行对请求的响应。

    我的问题是:-根据节点的性质,执行顺序是否正确,还是我做了一些错误的事情或遗漏了一个重要的概念?

    任何帮助都将感谢你们的帮助!!!

    2 回复  |  直到 8 年前
        1
  •  2
  •   freakish    8 年前

    JavaScript(几乎与任何其他语言一样)按顺序运行。如果你写

    var x = 1;
    x *= 2;
    x += 1;
    

    你期望结果是 3 4 那太糟糕了。函数也是如此。当你写作时

    foo();
    bar();
    

    你希望他们以同样的顺序运行。嵌套函数时,这不会改变:

    var foo = function() {};
    var bar = function(clb) {
        clb();
        foo();
    };
    var callback = function() {
    };
    bar(callback);
    

    预期的执行顺序为: bar -> callback -> foo .

    因此,人们在互联网上造成的最大损害是他们在异步编程和回调模式之间使用等号。 这是错误的 有许多使用回调模式的同步函数,例如。 Array.prototype.forEach() .

    真正发生的是,NodeJS在幕后有这个事件循环。您可以通过调用多个特殊函数来告诉它安排一些事情并稍后运行: setTimeout , setInterval , process.nextTick 举几个例子。所有I/O还调度事件循环中要完成的一些事情。现在,如果你这样做了

    var foo = function() {};
    var bar = function(clb) {
        procress.nextTick(clb);  // <-- async here
        foo();
    };
    var callback = function() {
    };
    bar(callback);
    

    预期的执行顺序如下: bar -> (schedule callback) -> foo 然后 callback 将在某个点触发(即,当处理所有其他排队任务时)。

    这就是它的工作原理。

        2
  •  0
  •   Virendra Singh Rathore    6 年前

    您一直在编写同步代码,并希望它异步运行。使用回调并不意味着它是异步操作。您应该尝试在函数中使用计时器和api来感受node js非阻塞异步模式。我希望 The Node.js Event Loop 将帮助您开始。