【问题标题】:Both asynchronus and synchronus function calls in the same node.js programme同一个 node.js 程序中的异步和同步函数调用
【发布时间】:2015-11-04 04:54:41
【问题描述】:

在下面的 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”的过程,然后服务器看到同步读取调用并再次开始读取输入.txt。但是由于异步调用首先开始读取,当同步函数完成读取.txt时,异步函数的回调将被传递到事件循环并应该首先执行..

所以第一行输出应该是

Asynchronous read: abc

我哪里错了?

【问题讨论】:

    标签: node.js asynchronous synchronous


    【解决方案1】:

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

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

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

    3.- 在执行同步读取时,您的异步函数结束并将回调放入回调队列中,待调用堆栈空闲后执行。

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

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

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

    【讨论】:

      【解决方案2】:

      但是由于异步调用首先开始读取,当同步函数完成读取 .txt 时,异步函数的回调将被传递给 events 循环并且应该首先执行..

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

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

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

      在发生同步操作时不能执行其他 javascript。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 2013-07-12
        • 2015-03-19
        • 1970-01-01
        • 2020-10-13
        • 2012-02-25
        • 2021-03-29
        • 1970-01-01
        相关资源
        最近更新 更多