createWriteStream示例隐藏nodeJS中的另一个示例

g6baxovj  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我的目标是这样做:

function writer1(data,file){
    const w = fs.createWriteStream(file,{flags:'w'})
    for(let i = 0; i< data.length; i++){
       w.write(data[i])
    }
    w.end()
}

function writer2(data,file, *some-stuff*){
    const w = fs.createWriteStream(file,{flags:'w'})
    for(let i = 0; i< data.length; i++){
        if(data[i] !== *some-stuff*){
              w.write(data[i])
        }
    }
    w.end()
}

writer1(data,"file.txt")
writer2(data,"file.txt", "some string")

重要注意事项:在我写的这段代码中,writer 1有一个要运行的条件;仅当需要写入的文件不存在时,它才运行

但这里是我的问题;如果相应的文件不存在,即如果项目的“STATE”为init-state,则启动writer 1,但以某种方式屏蔽writer 2的执行。结果是一个填充了内容DATA的txt文件。
在第二次传递中,writer 1不启动,不隐藏writer 2的执行,结果是一个txt文件,其中填充了DATA减去变量some-stuff的内容。
本质上,我的问题是:

为什么第一个流会遮蔽第二个流?如何防止这种情况?

我确实理解,为了允许其他流访问相同的文件,有一些异步的东西要处理,或者需要向流对象发出请求。

2ul0zpep

2ul0zpep1#

写入流是一个异步过程。如果在writer1关闭文件之前在writer2中再次打开该文件,则writer2的写入可能会丢失。
writer1的以下变体是一个异步函数,它只在关闭文件后解析。您可以在调用writer2之前执行await

function writer1(data, file) {
  return new Promise(function(resolve, reject) {
    const w = fs.createWriteStream(file, {flags: 'w'})
    .on("close", resolve)
    .on("error", reject);
    for (let i = 0; i < data.length; i++)
      w.write(data[i]);
    w.end();
  });
}
function writer2(...) // similar
await writer1(data, "file.txt");
await writer2(data, "file.txt", "some string");

但我支持jfriend00的问题,即你试图解决的是什么问题。

相关问题