如何找出Node.js的执行顺序?

use*_*078 -4 javascript asynchronous synchronous fs node.js

我目前正在尝试测试一些Node.js代码。现在,我试图弄清楚为什么我的代码console.log()相对于代码执行顺序而言是不同的顺序。这与操作系统相关的Node.js函数调用有关。

我的脚本按顺序执行此操作:

//First
fs.readdir(){ //read from a directory all the available files
   console.log some stuff #a
}

//Second
fs.readFile(){ //read entire text file
   console.log some stuff #b
}

//Third
//create readline interface using fs.createReadStream(filedir) then

interface{ //read from text file line by line
   console.log some stuff #c
}
Run Code Online (Sandbox Code Playgroud)

函数a使用路径:__dirname +'/ text_file /'
函数b和c使用路径:__dirname,' /text_file/ text1.txt'

输出:

a
c
b
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么发生此命令吗?我不是操作系统方面的专家,也不是Node.js在后台发生的事情。如果我要依赖此命令,是否会使我的应用程序混乱?

jfr*_*d00 5

如果您像这样一个接一个地启动多个异步操作,则完成顺序不确定。这些操作独立于Javascript运行。它们就是所谓的“非阻塞”,这意味着它们会立即从函数调用中返回,并且Javascript会继续执行。一段时间后,它们完成,在Javascript事件队列中插入一个事件,然后调用传递给它们的回调。这些函数的“异步,非阻塞”方面意味着它们在返回之前不“等待”操作完成。

一次同时进行的多个异步操作的完成顺序仅取决于哪个操作比另一个操作先完成。

如果希望它们按顺序运行,则必须通过在第一个操作的完成回调中启动第二个操作并在第三个操作的完成回调中启动第三个操作,对它们进行顺序编码,以使其顺序运行。

例如:

fs.readdir(somePath, function(err, files) {
    if (err) {
        console.log(err);
    } else {
        fs.readFile(someFilename, function(err, data) {
            if (err) {
                console.log(err);
            } else {
                // done with both asynchronous operations here
                console.log(data);
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

关于该主题的其他一些相关参考资料:

如何让异步readFile方法遵循node.js中的顺序

如何同步承诺序列?

涉及异步调用时,如何设置特定的执行顺序?

异步Javascript执行如何发生?什么时候不使用return语句?

单线程同步和异步混淆

为什么回调函数允许我们用Java异步执行操作?