Javascript 在Nodejs中,为什么同步代码先于异步代码执行?

Javascript 在Nodejs中,为什么同步代码先于异步代码执行?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有以下代码: console.log('1'); process.nextTick(() => console.log('inside nextTick')); setImmediate(()=> console.log('inside setImmediate')); console.log("2"); for(var i=0;i<1 ; i++) { console.log("inside for loop"); } 请解释为什么会这样。即使我已经编写了cons

我有以下代码:

console.log('1');
process.nextTick(() => console.log('inside nextTick'));
setImmediate(()=> console.log('inside setImmediate'));
console.log("2");
for(var i=0;i<1 ; i++) {
    console.log("inside for loop");
}

请解释为什么会这样。即使我已经编写了
console.log(“2”)
进程之后的
for循环
。nextTick
setImmediate
,它们为什么在它们之前执行?

这就是异步代码在JavaScript中的工作方式。安排异步代码时,它将添加到事件队列中。这由主事件循环处理,它仅在同步代码返回时获得控制。因此,所有同步代码运行,记录所有这些消息,然后返回主事件循环,调用所有异步任务。

异步是一种行为,如果我们有两行代码第1行和第2行。第1行是一条耗时的指令。因此,第1行开始在后台执行其指令(就像守护进程),允许第2行开始执行,而无需等待第1行完成。 当事情进展缓慢时,我们需要这种行为。代码的同步执行看起来可能很简单,但可能很慢。像图像处理这样的任务可能会很慢,文件操作可能会很慢,发出网络请求和等待响应肯定会很慢,进行像超过1亿次for循环迭代这样的巨大计算会有点慢。所以调用堆栈中如此缓慢的事情会导致“阻塞”。当调用堆栈被阻塞时,浏览器会阻止用户的中断和其他代码语句执行,直到阻塞语句被执行并且调用堆栈被释放。因此,异步回调用于处理此类情况

ex:
console.log("Hello");
setTimeout(function(){ console.log("Susi");},2000);
console.log("Iam");

o/p: Hello, Iam susi.
在您的示例中,它将首先打印控制台语句,因为process.next将在事件循环的下一次迭代中执行,然后是setimmediate。因此,您将获得如下输出

1
2
inside for loop
inside nextTick
inside setImmediate

请仔细阅读这篇文章,
process.nextTick()
setImmediate()
都是为处理事件循环的未来滴答声而设计的(这是它们使用它们的全部要点),所以当然,解释器在事件循环的当前滴答声中完成同步代码,然后为事件循环的未来滴答声安排的异步操作有机会传达其完成情况并运行回调。
1
2
inside for loop
inside nextTick
inside setImmediate