在Node.js中,为什么在异步之前执行同步代码?

时间:2020-03-12 05:55:00

标签: 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");
}

输出为:

1
2
inside for loop
inside nextTick
inside setImmediate

请解释为什么会这样。即使我在console.log("2");for loop之后写了process.nextTicksetImmediate,为什么还要在它们之前执行?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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
相关问题