在Node.js设计模式中释放zalgo为什么异步路径是一致的?

Jas*_*Jas 9 javascript asynchronous node.js zalgo

在我正在阅读的伟大着作中,NodeJs design patterns我看到以下示例:

var fs = require('fs');
var cache = {};

function inconsistentRead(filename, callback) {
    if (cache[filename]) {
        //invoked synchronously
        callback(cache[filename]);
    } else {
        //asynchronous function
        fs.readFile(filename, 'utf8', function(err, data) {
            cache[filename] = data;
            callback(data);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

function createFileReader(filename) {
    var listeners = [];
    inconsistentRead(filename, function(value) {
        listeners.forEach(function(listener) {
            listener(value);
        });
    });
    return {
        onDataReady: function(listener) {
            listeners.push(listener);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

和它的用法:

var reader1 = createFileReader('data.txt');
reader1.onDataReady(function(data) {
console.log('First call data: ' + data);
Run Code Online (Sandbox Code Playgroud)

作者说,如果项目在缓存中,则行为是同步的,如果不在缓存中则是异步的.我很好.然后他继续说我们应该同步或异步.我很好.

我不明白的是,如果我采用异步路径,那么当var reader1 = createFileReader('data.txt');执行此行时,异步文件读取是否已经完成,因此侦听器将不会在尝试注册它的以下行中注册?

Que*_*tin 2

JavaScript 永远不会中断一个函数来运行另一个函数。

“文件已读取”处理程序将排队,直到 JavaScript 事件循环空闲。