gpt4 book ai didi

javascript - 了解 node.js 中的异步函数

转载 作者:行者123 更新时间:2023-11-30 17:53:33 25 4
gpt4 key购买 nike

我正在学习 nodejs。我很难理解异步函数的工作原理。我的问题与下面的代码有关。我正在尝试按照以下完全相同的顺序执行以下操作:

  1. 打开文件 a.txt。
  2. 阅读它。
  3. 打印其内容。
  4. 关闭它并记录文件已关闭。
  5. 再次打开它。
  6. 用新内容覆盖它。

问题是,根据我得到的输出,我似乎无法控制这些事件的顺序。这是我在控制台中得到的输出:

只读了 21 个字节/这是我的测试文件/只写了 30 个字节/文件关闭并准备写入

因此,如您所见,出于某种原因,程序在记录文件已关闭之前正在写入文件。我试图关闭它,记录它已关闭然后写入文件。

所以我认为我在控制事件流方面遇到了问题。你能指出我做错了什么吗?

这是代码:

var fs = require('fs');

//What I am trying to do here is: open a file a.txt, read it, print its content and then //close the file and log that it has been closed.
//Then, open it again and overwrite it.

fs.open('a.txt', 'r', function(err, fd){
if(err){throw err;}
var readBuffer = new Buffer(1024);
var bufferOffset = 0;
var filePosition = 0;
var readBufferLength = readBuffer.length;

fs.read(fd, readBuffer, bufferOffset, readBufferLength, filePosition, function(err, readBytes){
if(err){throw err;}
console.log('just read ' + readBytes + ' bytes');
console.log(readBuffer.slice(0,readBytes).toString());
fs.close(fd,function(){
console.log('file close and ready for write');
});
});




});


fs.open('a.txt', 'r+', function(err,fd){
if(err){throw err;}
var writeBuffer = new Buffer('saul lugo overwrote this file!');
var bufferOffset = 0;
var writeBufferLength = writeBuffer.length;
var filePosition = null;

fs.write(fd, writeBuffer, bufferOffset, writeBufferLength, filePosition, function(err, writeBytes){
if(err){throw err;}
if(writeBytes>0){
console.log('just wrote ' + writeBytes + ' bytes.');
}
});
});

最佳答案

您需要等到第 4 步完成后再调用 fs.open。

现在你的代码有点像

fs.open("a.txt", function(){
foo(function(){
console.log("done with first file")
})
});

fs.open("a.txt", function(){
foo(function(){
console.log("done with second file")
})
});

为了保留嵌套函数所需的顺序:

fs.open("a.txt", function(){
foo(function(){
console.log("done with first file")

fs.open("a.txt", function(){
foo(function(){
console.log("done with second file")
})
});
})
});

当然,这现在看起来非常难看,而且 4+ 级深度的净值很难读懂。你可以通过创建额外的命名函数让它看起来更好一些

  console.log("done with first file");
doThingsWithSecondFile();

或者您可以查看 async.js 或 promises 等库。 (如果你想在默认情况下更好地处理错误,这些库特别有用)

关于javascript - 了解 node.js 中的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com