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

时间:2015-08-11 19:48:56

标签: node.js asynchronous synchronous

在以下nodejs程序中,input.txt中只包含一个字符串“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

现在,问题是,当程序开始执行时,它首先看到异步读取文件调用并在后台运行“读取input.txt”进程,然后服务器看到同步读取调用并再次开始读取input.txt中。但是,当异步调用首次启动读取时,当同步函数完成读取.txt时,异步函数的回调将被传递给事件循环并且应该首先执行..

所以第一行输出应该是

Asynchronous read: abc

我哪里错了?

2 个答案:

答案 0 :(得分:1)

我认为该程序正在遵循下一个行为。

1.-开始异步读取文件。

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

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

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

我不是百分百肯定的,但我基于这个解释,我认为是有道理的。

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

答案 1 :(得分:1)

  

但是,当异步调用首次启动读取时,当同步函数完成读取.txt时,异步函数的回调将被传递给事件循环并且应该先执行< /强> ..

强调区域是错误理解发生的地方。回调传递给回调队列,而不是事件循环。事件循环在callstack为空之前不会循环,直到同步操作完成才会发生。

一旦callstack为空,事件循环将运行,从回调队列中弹出一个回调,然后执行它。这就是异步回调在同步操作之后而不是之前发生的原因。

在执行同步操作时,不能执行回调 ,因为在执行同步操作时,事件循环不循环。

同步操作发生时,无法执行其他任何javascript。