Javascript Streams API:是否可以撤消.pipeTo()?

Javascript Streams API:是否可以撤消.pipeTo()?,javascript,serial-port,whatwg-streams-api,Javascript,Serial Port,Whatwg Streams Api,提供了一种简洁的方法,可以使用将可读流输送到可写流。这似乎比获取readableStream.getReader()并手动将其粘贴到writeablestream.getWriter()或直接粘贴到底层功能更方便 我有一个用例,其中提供了一个ReadableStream对象,该对象可能最终需要“离开”,并被一个新的ReadableStream对象替换。最好使用一个自定义的writeablestream来包装这些ReadableStream对象与之接口的功能,并根据需要将它们连接在一起,但还没有找

提供了一种简洁的方法,可以使用将
可读流
输送到
可写流
。这似乎比获取
readableStream.getReader()
并手动将其粘贴到
writeablestream.getWriter()
或直接粘贴到底层功能更方便

我有一个用例,其中提供了一个
ReadableStream
对象,该对象可能最终需要“离开”,并被一个新的
ReadableStream
对象替换。最好使用一个自定义的
writeablestream
来包装这些
ReadableStream
对象与之接口的功能,并根据需要将它们连接在一起,但还没有找到如何“撤消”管道过程

Q:是否可以“撤消”/“断开”/“拆卸”使用
.pipeTo()创建的管道,或者管道是“永久性的”且不适用于此用例?

例如,我希望能够反复调用
doConnectPort()
,然后调用
doDisconnectPort()

var customwriteable=newwriteablestream(…);
var端口;
异步函数doConnectPort(){
port=wait navigator.serial.requestPort();
等待端口打开({波特率:…});
wait port.readable.pipeTo(可自定义写入);
}
异步函数doDisconnectPort(){
//在这里做什么?还不能关闭端口-端口仍处于锁定状态!
等待端口关闭();
}
目前,我手动将东西粘在一起,并在断开端口连接时进行清理:

var端口;
var端口读取器;
异步函数doConnectPort(){
port=wait navigator.serial.requestPort();
等待端口打开({波特率:…});
portReader=port.readable.getReader();
while(true){
const{value,done}=wait-portReader.read();
如果(完成){
打破
}
//做有价值的事
}
}
异步函数doDisconnectPort(){
等待portReader.cancel();
等待portReader.releaseLock();
等待端口关闭();
}
您可以在
管道中向
的选项对象的
信号传递一个

const btn=document.querySelector(“按钮”);
const checkbox=document.querySelector(“输入”);
如果(!ReadableStream.prototype.pipeTo){
console.warn(“您的浏览器不支持pipeTo”);
}
否则{
btn.onclick=(evt)=>{
控制台。清除(“”);
const blob=新blob([“hello”]);
const readable=blob.stream();
const target=new TransformStream();
const abort_controller=新的AbortController();
target.readable.getReader().read().then(console.log);
可读.pipeTo(target.writable,{signal:abort_controller.signal})
.catch(console.error)
如果(复选框。选中){
abort_controller.abort();
}
};
}
中止管道
新测试
您可以通过
管道到
的选项对象的
信号

const btn=document.querySelector(“按钮”);
const checkbox=document.querySelector(“输入”);
如果(!ReadableStream.prototype.pipeTo){
console.warn(“您的浏览器不支持pipeTo”);
}
否则{
btn.onclick=(evt)=>{
控制台。清除(“”);
const blob=新blob([“hello”]);
const readable=blob.stream();
const target=new TransformStream();
const abort_controller=新的AbortController();
target.readable.getReader().read().then(console.log);
可读.pipeTo(target.writable,{signal:abort_controller.signal})
.catch(console.error)
如果(复选框。选中){
abort_controller.abort();
}
};
}
中止管道
新测试
我问过,也收到了类似的答案(但还没有在这里分享)。我已经验证了这种方法适用于串行API用例。我已经询问并收到了类似的答案(但还没有在这里分享)。我已经验证了这种方法适用于串行API用例。