我很困惑使用管道来处理写流是否同步,因为我发现了一个关于回调来处理管道完成的问题
我只是想确保写流在其他人之前完成,比如fs.rename
,所以我简化了它,代码如下:
(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)
})
}
}())
它是有效的,但我读了管道文件后感到困惑,因为它说
默认情况下,流。当源可读流发出“end”时,对目标可写流调用end(),因此目标不再可写。
所以我只需要
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,当我们完成了写入临时文件时,这个promise就会解决。在继续之前,你需要等待这个promise。
然而,如果您也添加一些错误处理代码与流,如错误处理中提到的node.js流,那将是非常好的
创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?
我看到很多javafx代码如下所示: 我对为什么要这样做的解释很感兴趣(我还没有找到)。
帮助这个的正确答案是什么??USE fruit后面没有分号。所以我想是A。 但是为什么要指定他们想要的数据库呢? 如果是你,你会选择什么? 编写一个查询,在水果数据库中创建一个名为prices的表。 A)创建表价格(项目VARCHAR(50),价格浮动); B)使用水果创建表价格(项目VARCHAR(50),价格浮动); C)使用水果插入表价格(项目VARCHAR(50),价格浮动); 啊,对不起
问题内容: 我有一个非常简单的文件: 而且有效。 但是,当我删除元素时,应用程序看不到实体(所有类都带有注释)。 是否有自动扫描类的机制? 问题答案: 你可以使用 该文件定义了一个名为的持久性单元,它使用JTA感知数据源。所述和元素指定管持久类:实体类,可嵌入类和超类映射。该元素指定JAR文件都包含持久化类管理的打包持久单元可见,而该class元素明确命名持久化类管理。 对于,也可以进行设置和配置
问题内容: 我需要在声明式管道中启动一组动态测试。为了更好的可视化目的,我想为每个测试创建一个阶段。有办法吗? 创建一个我知道的阶段的唯一方法是: 我已经看到了这个示例,但是我没有使用声明性语法。 问题答案: 使用声明性语法比声明性语法更具灵活性的脚本化语法,即使声明性文档和建议性更多。 例如,可以循环创建阶段:
我正在计划一个新的星火集群。我的问题是我需要在所有数据节点上安装spark worker节点吗?例如,如果我有50个数据节点,而我只安装了10个spark worker节点,这合理吗?谢了!