繁体   English   中英

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

[英]In Nodejs, why synchronous code is executed before 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"); 以及process.nextTicksetImmediate之后的for loop ,为什么它们在它们之前执行?

这就是异步代码在 JavaScript 中的工作方式。 当您调度异步代码时,它会被添加到事件队列中。 这是由主事件循环处理的,它只在同步代码返回时获得控制权。 所以所有同步代码都会运行,记录所有这些消息,然后返回到主事件循环,调用所有异步任务。

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

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

o/p: Hello, Iam susi.

在您的示例中,它首先会打印控制台语句,因为 process.next 将在事件循环的下一次迭代中执行,然后设置为立即执行。 由于您得到如下输出。

1
2
inside for loop
inside nextTick
inside setImmediate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM