我是Node js编程的新手,因此想要非常恰当地理解核心概念和实践。 AFAIK节点js具有非阻塞I / O,允许所有磁盘和其他I / O操作以异步方式运行,而其JS在单线程中运行,使用Event Loop管理资源和执行路径。正如许多地方所建议的,建议开发人员使用回调模式编写自定义函数/方法,例如
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
函数代码,该代码将依次调用回调函数。如果以这种方式发生,则事件循环将被解除阻塞,并且只有在通过“回调”函数准备好最终响应时才会执行对请求的响应。
我的问题是: - 执行顺序是否符合节点的性质或我是做错了还是错过了一个重要的概念?
任何帮助都会感谢你们!
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
将在某个时刻触发(即,当处理所有其他排队的任务时)。
这几乎是它的工作原理。
您正在编写同步代码并期望它以异步方式运行。仅仅因为你使用回调并不意味着它是一个异步操作。你应该尝试在你的函数中使用定时器,api来感觉节点js非阻塞异步模式。我希望The Node.js Event Loop能帮助你开始。