Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node JS中的事件循环阻塞和异步编程_Javascript_Node.js_Asynchronous_Event Loop - Fatal编程技术网

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

Javascript Node JS中的事件循环阻塞和异步编程,javascript,node.js,asynchronous,event-loop,Javascript,Node.js,Asynchronous,Event Loop,我是NodeJS编程的新手,因此希望非常恰当地理解核心概念和实践。AFAIK节点js具有非阻塞I/O,允许所有磁盘和其他I/O操作以异步方式运行,而其js以单线程运行,使用事件循环管理资源和执行路径。正如许多地方所建议的那样,建议开发人员使用回调模式编写自定义函数/方法,例如 function processData(inputData, cb){ // do some computation and other stuff if (err) { cb(err, null)

我是NodeJS编程的新手,因此希望非常恰当地理解核心概念和实践。AFAIK节点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
函数代码,这将反过来调用回调函数。如果以这种方式发生,事件循环将被解锁,并且只有在“回调”函数准备好最终响应时才会执行对请求的响应

我的问题是:-根据节点的性质,执行顺序是否正常,或者我是否做错了什么,或者遗漏了一个重要的概念

你们的任何帮助都将不胜感激

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

var x = 1;
x *= 2;
x += 1;
foo();
bar();
您希望结果是
3
,而不是
4
。那太糟糕了。函数也是如此。当你写作时

var x = 1;
x *= 2;
x += 1;
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);
var foo=function(){};
变量条=功能(clb){
procress.nextTick(clb);/(调度回调)->foo
,然后
回调将在某个点触发(即,当处理所有其他排队的任务时)


这就是它的工作原理。

您一直在编写同步代码,并希望它能够异步运行。仅仅因为您使用回调并不意味着这是一个异步操作。您应该尝试在函数中使用计时器、api来感受节点js的非阻塞异步模式。我希望能够帮助您获得开始。

好的。如果我包装通常的代码(由开发人员编写)在setTimeOut或其他延迟/延迟计时函数中,控件将立即从那里返回到下一个执行行,因此此方法将为事件循环留出一些空间,以处理来自队列的下一个请求。因此,对于node js,大多数开发人员代码是封装在内部还是必须使用这些特殊函数来允许非b锁定代码执行?@i首先要允许非阻塞代码,您必须使用特殊功能。但是,请注意,许多库(例如数据库驱动程序)都会在后台为您执行。事件循环也可以从C级别访问(如果您正在编写C插件)。此外,您是否真的需要非阻塞代码取决于上下文。大多数情况下(即,当您不使用db等外部资源时)没有它你就可以了。好吧。结果表明,不涉及I/O的代码不会明显影响事件循环阻塞。此外,我还尝试使用mongoose库进行DB交互,并使用上面类似的代码评估其异步执行。但在这种情况下,控制台最后打印,mongoose代码首先运行。mongoose是否会n异步是否真的以非阻塞方式进行,即使在为其调用提供回调之后?@I首先,不涉及I/O的代码可能会显著影响事件循环。例如,如果您进行大量计算(例如更新复杂的统计模型).但一般来说,是的,您应该将I/O安排到事件循环中。至于mongoose:这完全取决于您使用的函数。我建议阅读文档(或源代码)为了100%确定它所做的是异步的还是非异步的。嗨!我知道这个问题得到了100%满意的解释。我只是想知道-我是否使用了node js中引入的async Wait API,我是否还需要将这些函数包装在setTimeOut()func中,以实现非阻塞并几乎并行运行?