我是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
功能代码,然后再调用回调函数。如果以这种方式发生,则事件循环将被解除阻塞,并且只有在通过“回调”函数准备好最终响应时才会执行对请求的响应。
我的问题是: - 执行顺序是否符合节点的性质或我是做错了还是错过了一个重要的概念?
任何帮助都会得到你们的赞赏!!!
答案 0 :(得分:1)
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
将在某个时刻触发(即处理所有其他排队任务时)。
它几乎是如何运作的。
答案 1 :(得分:0)
您一直在编写同步代码,并期望它异步运行。仅仅因为您使用回调并不意味着它是一个异步操作。您应该尝试在函数中使用计时器,api来感觉节点js非阻塞异步模式。希望The Node.js Event Loop可以帮助您入门。