在同一个node.js程序中调用asynchronus和synchronus函数

在下面的nodejs程序中,input.txt中只有一个string“abc”。

var fs = require("fs"); // Asynchronous read fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("Asynchronous read: " + data.toString()); }); // Synchronous read var data = fs.readFileSync('input.txt'); console.log("Synchronous read: " + data.toString()); console.log("Program Ended"); 

输出是

 Synchronous read: abc Program Ended Asynchronous read: abc 

现在问题是,当程序开始执行时,首先看到asynchronous读文件调用,并在后台运行“读input.txt”的过程,然后服务器看到同步读调用,并再次开始读取input.txt 。 但是,由于asynchronous调用已经开始读取,所以当同步函数完成对.txt的读取之后,asynchronous函数的callback就会被传递给事件循环,并且应该先被执行。

所以第一行应该是

 Asynchronous read: abc 

我在哪里错了?

但是,由于asynchronous调用已经开始读取,所以当同步函数完成对.txt的读取之后,asynchronous函数的callback就会被传递给事件循环,并且应该先被执行

强调的领域是误解发生的地方。 callback传递给callback队列,而不是事件循环。 事件循环直到调用堆栈为空之后才会循环,直到同步操作完成才会发生。

一旦调用堆栈为空,事件循环将运行,从callback队列中popup一个callback,并执行它。 这就是asynchronouscallback发生在同步操作之后而不是之前发生的原因。

执行同步动作时, 不能执行callback,因为执行同步动作时,事件循环不循环。

同步操作发生时,不能执行其他JavaScript。

我认为该计划是继下一个行为。

1.-开始读取asynchronous文件。

2. 立即开始读同步同一个文件(阻塞调用堆栈)。

3.-当同步读取正在执行时,asynchronous函数结束并将callback放在callback队列中,一旦调用堆栈空闲,就会执行该callback。

4.-一旦同步函数和console.log语句结束(调用堆栈不再被阻塞或忙碌),事件循环会将队列上的callback移至调用堆栈,并执行asynchronouscallback。

我不是100%确定的,但我基于这个解释,我认为是有道理的。

https://www.youtube.com/watch?v=8aGhZQkoFbQ