事件循环阻塞和节点JS中的asynchronous编程

我是节点js编程的新手,因此要非常适当地理解核心概念和实践。 AFAIK节点js具有非阻塞I / O,允许所有磁盘和其他I / O操作以asynchronous方式运行,而JS运行在使用Event Looppipe理资源和执行path的单线程中。 正如许多地方的build议,开发人员build议使用callback模式编写自定义函数/方法

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函数代码,然后调用callback函数。 如果以这种方式发生,则事件循环将被解除阻塞,并且只有在通过“callback”函数准备好最终响应时才会执行对请求的响应。

我的问题是: – 按照节点的性质,执行顺序是否正确?或者我做错了什么?或者错过了一个重要的概念?

任何帮助,将不胜感激,你们!

JavaScript(就像其他语言一样)按顺序运行。 如果你写

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

你期望的结果是3 ,而不是4 。 这将是非常糟糕的。 function也一样。 当你写

 foo(); bar(); 

你期望他们以相同的顺序运行。 嵌套函数时不会改变:

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

预期的执行顺序是bar -> callback -> foo

所以人们在互联网上造成的最大伤害就是在asynchronous编程和callback模式之间加上了等号。 这是错误的 。 有很多使用callback模式的同步函数,例如Array.prototype.forEach()

真正发生的是NodeJS有这个事件循环。 您可以通过调用多个特殊函数来告诉它安排某些内容,然后运行: setTimeoutsetIntervalprocess.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会在某个时候触发(即当所有其他排队的任务被处理时)。

这几乎是如何工作。