Node JS 中的事件循环阻塞和异步编程
Event loop blocking and async programming in Node JS
我是 Node js 编程的新手,因此想非常恰当地理解核心概念和实践。 AFAIK 节点 js 具有非阻塞 I/O 允许所有磁盘和其他 I/O 操作 运行ning 异步方式,而其 JS 运行s 在单线程中管理资源和执行路径使用事件循环。正如许多地方所建议的那样,建议开发人员使用回调模式编写自定义 functions/methods,例如
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' 函数准备好最终响应时才执行对请求的响应。
我的问题是:- 执行顺序是否符合节点的性质,或者我做错了什么或遗漏了一个重要的概念?
任何帮助都将不胜感激!!!
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
等等。 All 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 来感受 node js 非阻塞异步模式。我希望 The Node.js Event Loop 能帮助您入门。
我是 Node js 编程的新手,因此想非常恰当地理解核心概念和实践。 AFAIK 节点 js 具有非阻塞 I/O 允许所有磁盘和其他 I/O 操作 运行ning 异步方式,而其 JS 运行s 在单线程中管理资源和执行路径使用事件循环。正如许多地方所建议的那样,建议开发人员使用回调模式编写自定义 functions/methods,例如
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' 函数准备好最终响应时才执行对请求的响应。
我的问题是:- 执行顺序是否符合节点的性质,或者我做错了什么或遗漏了一个重要的概念?
任何帮助都将不胜感激!!!
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
等等。 All 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 来感受 node js 非阻塞异步模式。我希望 The Node.js Event Loop 能帮助您入门。