node.js - 这个终端日志是 Node JS 异步特性的结果吗?
问题描述
我还没有找到任何具体的信息,这不是一个真正的问题,但我想更好地了解这里发生了什么。
基本上,我正在测试一些简单的 NodeJS 代码,如下所示:
//Summary : Open a file , write to the file, delete the file.
let fs = require('fs');
fs.open('mynewfile.txt' , 'w' , function(err,file){
if(err) throw err;
console.log('Created file!')
})
fs.appendFile('mynewfile.txt' , 'Depois de ter criado este ficheiro com o fs.open, acrescentei-lhe data com o fs.appendFile' , function(err){
if (err) throw err;
console.log('Added text to the file.')
})
fs.unlink('mynewfile.txt', function(err){
if (err) throw err;
console.log('File deleted!')
})
console.log(__dirname);
我以为这段代码会按照从上到下的顺序执行,但是当我查看终端时,我不确定情况是否如此,因为这是我得到的:
$ node FileSystem.js
C:\Users\Simon\OneDrive\Desktop\Portfolio\Learning Projects\NodeJS_Tutorial
Created file!
File deleted!
Added text to the file.
//Expected order would be: Create file, add text to file , delete file , log dirname.
最后,当我查看我的文件夹时,代码顺序似乎仍然以某种方式被遵循,因为该文件已被删除,而我在目录上什么也没有留下,而不是终端可能会让您想到什么。
所以,我想知道,为什么终端没有按照代码从上到下编写的顺序登录。这是 NodeJS 异步性质的结果还是其他原因?
解决方案
正如您所说,代码(原则上)从上到下执行。但是fs.open
,fs.appendFile
和fs.unlink
是异步的。即,它们以特定的顺序放置在执行堆栈上,但是不能保证它们以什么顺序完成,因此您不能保证回调的执行顺序。如果您多次运行代码,很有可能会遇到不同的执行顺序......
如果您需要特定的订单,您有两种不同的选择
您仅在先前的回调中调用稍后的操作,即如下所示
fs.open('mynewfile.txt' , 'w' , function(err,file){ if(err) throw err; console.log('Created file!') fs.appendFile('mynewfile.txt' , '...' , function(err){ if (err) throw err; console.log('Added text to the file.') fs.unlink('mynewfile.txt', function(err){ if (err) throw err; console.log('File deleted!') }) }) })
你看,随着嵌套的增加,代码变得非常丑陋且难以阅读......
您切换到基于承诺的方法
let fs = require('fs').promises; fs.open("myfile.txt", "w") .then(file=> { return fs.appendFile("myfile.txt", "..."); }) .then(res => { return fs.unlink("myfile"); }) .catch(e => { console.log(e); })
使用操作的承诺版本,您还可以使用
async/await
async function doit() { let file = await fs.open('myfile.txt', 'w'); await fs.appendFile('myfile.txt', '...'); await fs.unlink('myfile.txt', '...'); }
对于所有三种可能性,您可能需要先关闭文件,然后才能取消链接。
有关更多详细信息,请阅读 Promisesasync/await
和 Javascript 中的执行堆栈
推荐阅读
- ios - iOS Deeplink 在启动应用程序时不起作用
- python - 创建收敛的整数列表
- r - 在 R 中安装“RcppCNPy”的问题
- cryptocurrency - 为什么我的币安钱包中的 BNB 数量会在我不买或卖的情况下发生变化?
- linux - 来自 /proc/ 的基址和限制地址
/ - angular - DOMException:无法在“WorkerGlobalScope”上执行“importScripts”:“http://localhost:4200/BlinkCardWasmSDK.js”处的脚本无法加载
- python - Python OCR 文本图像自动检测角度倾斜/旋转
- ios - UIImagePickerController 相机:如何使用全屏?(底部的黑色子视图)
- python - 在 python 脚本中运行两个 asynco 循环(telethon,aiopg)
- java - 使用带有特定用例的 Spring Security 获取访问令牌