gpt4 book ai didi

node.js - 异步文件追加

转载 作者:搜寻专家 更新时间:2023-11-01 00:33:43 25 4
gpt4 key购买 nike

在尝试学习 node.js/socket.io 时,我一直在搞乱创建一个简单的文件 uploader ,该文件 uploader 从客户端浏览器获取数据 block 并在服务器端重新组装。

用于接收 block 的 socket.io 事件如下所示:

socket.on('sendChunk', function (data) {
fs.appendFile(path + fileName, data.data, function (err) {
if (err)
throw err;
console.log(data.sequence + ' - The data was appended to file ' + fileName);
});
});

问题是由于异步调用,数据 block 不一定按照接收顺序附加。典型的控制台输出看起来像这样:

  • 1 - 数据附加到文件 testfile.txt
  • 3 - 数据附加到文件 testfile.txt
  • 4 - 数据附加到文件 testfile.txt
  • 2 - 数据附加到文件 testfile.txt

我的问题是,以非阻塞方式但强制顺序实现此功能的正确方法是什么。我看过像 async 这样的图书馆,但真的希望能够在每个文件进入时对其进行处理,而不是创建一个系列并在所有文件 block 都进入后运行。我仍在努力思考所有这些事件驱动的流程,所以任何指针都很棒。

最佳答案

通常您会为等待写入的数据使用一个队列,然后每当前一个附加完成时,您尝试写入下一个数据。像这样:

var parts = [];
var inProgress = false;
function appendPart(data){
parts.push(data);
writeNextPart();
}

function writeNextPart(){
if (inProgress || parts.length === 0) return;

var data = parts.shift();
inProgress = true;
fs.appendFile(path + fileName, data.data, function (err) {
inProgress = false;
if (err) throw err;
console.log(data.sequence + ' - The data was appended to file ' + fileName);

writeNextPart();
});
}

socket.on('sendChunk', function (data) {
appendPart(data);
});

您需要扩展它以根据文件名保留 partsinProgress 队列。为简单起见,我的示例假设这些将保持不变。

关于node.js - 异步文件追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917454/

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