首页 > 解决方案 > 如何确定 Node.js 的执行顺序?

问题描述

我目前正在尝试测试一些 Node.js 代码。现在我正试图弄清楚为什么我的代码 console.log() 的顺序与代码执行顺序不同。这是关于 OS 相关的 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
}

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

输出:

a
c
b

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

标签: javascriptnode.jsasynchronousfssynchronous

解决方案


如果你一个接一个地启动多个这样的异步操作,完成顺序是不确定的。这些操作独立于您的 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);
            }
        });
    }
});

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

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

如何同步一系列承诺?

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

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

单线程同步和异步的混淆

为什么回调函数允许我们在 Javascript 中异步执行操作?


推荐阅读