gpt4 book ai didi

node.js - 我需要在 Node 的管道方法中等待 fs.createWriteStream 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 23:36:58 24 4
gpt4 key购买 nike

我很困惑使用管道来处理写入流是否同步,因为我发现了一个关于 callback to handle completion of pipe 的问题

我只是想确保写入流在执行其他操作之前完成,例如 fs.rename,所以我 promise 它,代码如下:

(async function () {
await promiseTempStream({oldPath, makeRegex, replaceFn, replaceObj, tempPath})
await rename(tempPath, oldPath)
function promiseTempStream({oldPath, makeRegex, replaceFn, replaceObj, tempPath}) {
return new Promise((res, rej) => {
const writable = fs.createWriteStream(tempPath)
fs.createReadStream(oldPath, 'utf8')
.pipe(replaceStream(makeRegex ,replaceFn.bind(this, replaceObj), {maxMatchLen: 5000}))
.pipe(writable)
writable
.on('error', (err) => {rej(err)})
.on('finish', res)
})
}
}())

有效,但看完后我很困惑pipe doc ,因为它说

By default, stream.end() is called on the destination Writable stream when the source Readable stream emits 'end', so that the destination is no longer writable.

所以我只需要

await fs.createReadStream(oldPath, 'utf8')
.pipe(replaceStream(makeRegex ,replaceFn.bind(this, replaceObj), {maxMatchLen: 5000}))
.pipe(fs.createWriteStream(tempPath))
await rename(tempPath, oldPath)

或者只是

fs.createReadStream(oldPath, 'utf8')
.pipe(replaceStream(makeRegex ,replaceFn.bind(this, replaceObj), {maxMatchLen: 5000}))
.pipe(fs.createWriteStream(tempPath))
await rename(tempPath, oldPath)

哪种方法正确?非常感谢

最佳答案

您需要等待 tempPath 流上的 finish 事件。所以你可以做类似的事情

async function createTheFile() {
return new Promise<void>(resolve => {
let a = replaceStream(makeRegex, replaceFn.bind(this, replaceObj), { maxMatchLen: 5000 });
let b = fs.createWriteStream(tempPath);
fs.createReadStream(oldPath, 'utf8').pipe(a).pipe(b);
b.on('finish', resolve);
}
}

await createTheFile();
rename(tempPath, oldPath);

基本上,我们在这里创建了一个 promise,当我们完成写入 tempFile 时,该 promise 就会解析。在继续之前,您需要等待该 promise 。

但是,如果您还像 Error handling with node.js streams 中提到的那样在流中添加一些错误处理代码,那就太好了。

关于node.js - 我需要在 Node 的管道方法中等待 fs.createWriteStream 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752428/

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