javascript - 如何确定 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 后台发生的事情的专家。如果我依赖它,这个排序会搞乱我的应用程序吗?
解决方案
如果你一个接一个地启动多个这样的异步操作,完成顺序是不确定的。这些操作独立于您的 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 中的顺序
推荐阅读
- java - 关于 android 应用程序编码,特别是相机活动
- ruby-on-rails - omniauth-facebook:如何使用 Active Storage 保存头像?
- python - python - 将字符串转换为 unicode 字符串
- python-3.x - 为图像分类调整超参数 Keras
- azure-api-management - 使用密钥轮换的 Azure API 管理
- javascript - 如何用空格替换前导零
- python - 属性创建函数
- regex - 如何从批处理脚本调用 powershell 正则表达式命令
- javascript - 如何在 Javascript 中为 iOS 和 Android 创建可靠的指南针?
- sql - 表“a”有一个条目,但无法从这部分查询中引用它